查找foreach集合如何被修改

Jos*_*osh 2 c# loops for-loop function

如何在多线程应用程序中找出哪个函数或目标正在修改foreach循环中的项?

我不断收到错误"收集被修改;枚举操作可能无法执行".我没有删除或添加任何项目到for循环中的通用列表.我想知道它是如何被修改的.做这个的最好方式是什么?

谢谢

Jay*_*lan 7

等一下 - 我想我们都错过了这一点.

集合类不是线程安全的.如果多个线程正在访问集合而没有线程锁定,那么您需要修复它.这是一个特别阴险的问题,因为它可以正常工作[编辑 - 或抛出可预测的异常] 99.999%的时间,0.001%的时间它会做一些完全不可预测的事情,几乎不可能重现.

一个简单的方法是在任何代码访问集合的地方周围使用lock {}语句.这可能是轻微的矫枉过正,但这是最安全的计划.对于迭代,您可以锁定整个循环,或者如果您不想阻止其他长的线程,只需锁定它足够长的时间来创建快照:

object[] snap;
lock (list)
{
   snap = list.ToArray();
}
foreach (object x in snap) ...
Run Code Online (Sandbox Code Playgroud)