如何使可枚举操作能够安全使用SynchronizedCollection?

时间:2019-04-26 08:24:29

标签: c# list asynchronous concurrency synchronization

使用CallBase=true时,我可以捕获异常

SynchronizedCollection

System.InvalidOperationException Collection was modified; enumeration operation may not execute. 周期进行。

如果您查看SynchronizedCollection类的源代码,即在GetEnumerator方法中(实际上有两个是显式接口实现),您将看到:

foreach

It returns enumerator of inner List which is not thread safe

编辑。我问的不是在并发情况下该怎么办。我在问

  

如何使其成为线程安全的?

2 个答案:

答案 0 :(得分:1)

我认为有两种解决方法:

  1. 在System.Collections.Concurrent命名空间中使用ConcurrentBag<T>或其他集合。 (请注意,ConcurrentBag中的元素将不排序。)
  2. 检索数据时创建快照。

第二种方法在性能成本上要安全得多。

如果您使用的是.NetCore,ImmutableList<T>是快照的一种更好的方法,并且可以避免浅拷贝问题。

答案 1 :(得分:0)

我使用了SynchronizedCollection类,并使用了foreach (var element in this.items) yield return element; 这里 公开新的IEnumerator GetEnumerator()

使用了基类中的构造函数,这足以使其成为线程安全的