在多线程场景中使用以下模式是否安全:
var collecation = new List<T>(sharedCollection);
其中sharedCollection
可以由另一个线程同时修改(即添加或删除元素)?
我正在处理的场景是从BindingList复制项目,但问题应该是相对于任何标准集合类型。
如果它不是线程安全的,我应该锁定sharedCollection
,还是有更好的解决方案?
答案 0 :(得分:4)
您似乎已回答了自己的问题。不,将更改列表复制到另一个列表不是线程安全的,是的,您可以锁定sharedCollection
。请注意,复制时锁定sharedCollection
是不够的;您需要在阅读或更改其内容时随时锁定它。
编辑:只是关于何时错误锁定您正在修改的对象的注释 - 如果对象引用本身可以更改(如`sharedCollection = new List)或者它是否可以为null,然后创建一个单独的对象作为读/写发生的类的成员锁定。
答案 1 :(得分:0)
您可以锁定sharedCollection
的SyncRoot对象。
在这里解释: Lock vs. ToArray for thread safe foreach access of List collection