使用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!
编辑。我问的不是在并发情况下该怎么办。我在问
如何使其成为线程安全的?
答案 0 :(得分:1)
我认为有两种解决方法:
第二种方法在性能成本上要安全得多。
如果您使用的是.NetCore,ImmutableList<T>是快照的一种更好的方法,并且可以避免浅拷贝问题。
答案 1 :(得分:0)
我使用了SynchronizedCollection类,并使用了foreach (var element in this.items) yield return element;
这里
公开新的IEnumerator GetEnumerator()
使用了基类中的构造函数,这足以使其成为线程安全的