当我使用SynchronizedCollection
时,我可以捕获异常
System.InvalidOperationException
Collection was modified; enumeration operation may not execute.
在foreach
周期。
如果你看看SynchronizedCollection类的源代码,即在GetEnumerator方法中(实际上有两个是显式接口实现),你会看到:
List<T> items;
IEnumerator IEnumerable.GetEnumerator()
{
return ((IList)this.items).GetEnumerator();
}
public IEnumerator<T> GetEnumerator()
{
lock (this.sync)
{
return this.items.GetEnumerator();
}
}
It returns enumerator of inner List which is not thread safe!
编辑。我不知道在并发情况下我能做些什么。我问
如何使其线程安全?
我认为这有两个解决方案:
第二个是性能成本更安全。
如果您使用的是.NetCore,ImmutableList<T>是一种更好的快照方式,可以避免浅拷贝问题。
我使用了SynchronizedCollection类并在这里使用了foreach (var element in this.items) yield return element;
public new IEnumerator GetEnumerator()
使用了基类的构造函数,这足以使它成为线程安全的