如何在迭代(C#)时将ListItem添加到列表中?

Duc*_*tal 3 c# gtk mono multithreading thread-safety

我有一个小应用程序,使用BackgroundWorker来处理IEnumerator<T> list所有时间.

代码基本上是这样的:

while(true){
    foreach(T item in list){
       // Process each item and send process
       // Add an object in child List ( List<T1> item.Result )
    }
    Thread.Sleep(500);
}
Run Code Online (Sandbox Code Playgroud)

现在我有一个按钮和一个文本框,它将直接添加到IEnumerator中.

问题是,在我添加按钮后,后台工作人员继续处理它当前处理的项目,但在完成该项目后将停止.它不会继续下去.

如何安全地将项目添加到列表中而不影响后台工作者?在后台工作者旁边也会添加对象.这应该是什么解决方案?

谢谢

tva*_*son 6

让后台工作程序迭代原始列表的副本,而不是列表本身.

 while (true)
 {
       foreach (T item in new List<T>( list ))
       {
          ....
       }
       Thread.Sleep(500);
 }
Run Code Online (Sandbox Code Playgroud)

如果您在枚举时尝试修改集合,则枚举器将抛出异常.来自文档:

只要集合保持不变,枚举器仍然有效.如果对集合进行了更改,例如添加,修改或删除元素,则枚举数将无法恢复,并且下一次调用MoveNext或Reset会引发InvalidOperationException.如果在MoveNext和Current之间修改了集合,则Current返回它所设置的元素,即使枚举器已经失效.