等一下 - 我想我们都错过了这一点.
集合类不是线程安全的.如果多个线程正在访问集合而没有线程锁定,那么您需要修复它.这是一个特别阴险的问题,因为它可以正常工作[编辑 - 或抛出可预测的异常] 99.999%的时间,0.001%的时间它会做一些完全不可预测的事情,几乎不可能重现.
一个简单的方法是在任何代码访问集合的地方周围使用lock {}语句.这可能是轻微的矫枉过正,但这是最安全的计划.对于迭代,您可以锁定整个循环,或者如果您不想阻止其他长的线程,只需锁定它足够长的时间来创建快照:
object[] snap;
lock (list)
{
snap = list.ToArray();
}
foreach (object x in snap) ...
Run Code Online (Sandbox Code Playgroud)