您好我有一个单元测试附加到事件并根据处理程序中eventArgs的属性更新计数器,如下所示:
protected void UpdateCounts(object sender, EventArgs eventArgs)
{
lock (lockobject)
{
Counts[eventArgs.Target]++;
}
}
Counts是一个静态的Dictionary资源,该类中的所有单元测试都共享。我断言在测试结束时,我断言计数值为6表示Target的某个值(目标是枚举)。当我通过这个测试进行调试时,它总是传递最终的断言,但是,当我只运行它而没有任何断点时,Target的该值的计数可以是7或8,但绝不是6。
我意识到许多尝试访问Dictionary中的条目的线程可能会出现竞争条件,这就是我将锁定放在增量周围的原因。我还有一个TestInitialize方法,它在运行每个测试之前运行,如下所示:
[TestInitialize]
public void InitTest()
{
foreach (TargetType x in Enum.GetValues(typeof(Target)))
{
Counts[x] = 0;
}
}
有没有人对这里发生的事情有任何见解?
答案 0 :(得分:1)
几乎每次遇到这个问题时,它都会归结为一种竞争条件,这种情况在你调试时不太可能发生,因为你在逐步执行代码时减慢了执行速度。
我建议在调试或跟踪语句到达各个执行阶段时将其添加到线程中,以便确定竞争条件的存在位置。