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

标签 c# multithreading mono thread-safety gtk

我有一个使用 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);
}

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

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

如何在不影响后台工作人员的情况下安全地将项目添加到列表中?除了后台工作人员之外,还向项目添加对象。解决方案应该是什么?

谢谢

最佳答案

让后台工作人员迭代原始列表的副本,而不是列表本身。

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

如果您尝试在枚举集合时修改集合,枚举器将抛出异常。来自docs :

An enumerator remains valid as long as the collection remains unchanged. If changes are made to the collection, such as adding, modifying, or deleting elements, the enumerator is irrecoverably invalidated and the next call to MoveNext or Reset throws an InvalidOperationException. If the collection is modified between MoveNext and Current, Current returns the element that it is set to, even if the enumerator is already invalidated.

关于c# - 如何在迭代时将 ListItem 添加到列表中 (C#)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7372125/

相关文章:

c# - php 到 C# 使用 Rijindael-256 算法加密并使用 base64 算法编码的 JSON 数据数组

c# - 仅在 Visual Studio 中调试时出现 Automapper 性能问题

C# mvc5 - 检查用户是否在每个 Controller 方法中经过身份验证的简单方法

java - 处理 jackrabbit 中的 InvalidItemStateException

c++ - 以下代码对于多线程增量计数器和打印是否是一个好的解决方案?

java - 如何通过配置更改在 Android 上管理蓝牙连接?

c# - 如何使用 EF Core 中的集合更新分离对象?

java - MonoTouch 性能与 Objective-C/Java

c# - 是否可以使用 Mono 的 XSP Web 服务器托管 WCF 服务?

java - 如何避免 .flatMap(x-> reactiveAction(x).thenReturn(x))