是可以安全使用以下方式在多线程场景:列表复制线程安全吗?
var collecation = new List<T>(sharedCollection);
其中sharedCollection
可以在同一时间被另一个线程修改(即添加或删除的元素从它)?
我目前正在处理的场景是从BindingList复制项目,但问题应该是相对于任何标准的集合类型。
如果不是线程安全的,我应该在sharedCollection
上加锁还是有更好的解决方案?
是可以安全使用以下方式在多线程场景:列表复制线程安全吗?
var collecation = new List<T>(sharedCollection);
其中sharedCollection
可以在同一时间被另一个线程修改(即添加或删除的元素从它)?
我目前正在处理的场景是从BindingList复制项目,但问题应该是相对于任何标准的集合类型。
如果不是线程安全的,我应该在sharedCollection
上加锁还是有更好的解决方案?
您似乎已经回答了您自己的问题。不,将更改列表复制到另一个列表不是线程安全的,是的,您可以锁定sharedCollection
。请注意,在复制时锁定sharedCollection
是不够的;您需要在阅读或更改其内容时随时锁定它。
编辑:只是一个约时,它的坏锁定你正在修改的对象注意 - 如果对象引用本身是可以改变的(比如`sharedCollection =新的列表),或者如果它可以为null,则让一个单独的对象作为发生阅读/写作的类的成员进行锁定。
我希望收集副本是线程安全的,所以不需要锁定。在这种情况下,我将在GUI线程上创建列表副本以避免锁定。 –
@AlexanderPope,''sharedCollection'可以在后台线程修改,而你正在GUI线程上复制它?如果是这样,你仍然不是线程安全的。你要么确保列表只被一个线程使用,要么一路锁定...... – adv12
不,用例是根据某些标准从绑定中删除项目,并且为此,我需要要迭代的绑定列表的副本。我不喜欢在gui主题上制作副本的想法,但这似乎是最干净的方式。我知道锁定集合可能会导致死锁,但我想尽可能地提出问题的基本原则。 –
您可以锁定sharedCollection
的SyncRoot对象。
这里解释一下: Lock vs. ToArray for thread safe foreach access of List collection
_Nothing_约'名单'突变是线程安全的。 –
SLaks