是ICollection <t>。添加ThreadSafe吗?</t>

时间:2013-09-22 22:39:36

标签: c# multithreading list collections thread-safety

我有一个BindingList,我将在两个不同的主题中填充...使用BindingList.Add()方法ThreadSafe?

3 个答案:

答案 0 :(得分:4)

不,Collection<T>.Add不是线程安全的。

MSDN通常涵盖课程文章中的线程安全,而不是单个方法。即Collection

  

只要未修改集合,集合就可以同时支持多个读者。即便如此,通过集合枚举本质上不是一个线程安全的过程。为了在枚举期间保证线程安全,您可以在整个枚举期间锁定集合。要允许多个线程访问集合以进行读写,您必须实现自己的同步

请注意,您不能说接口的方法是否是线程安全的,因为接口没有定义任何线程安全要求,它只指定方法签名。如果对线程安全有任何特殊保证,则需要检查每个单独的实现。

答案 1 :(得分:2)

不,BindingList.Add方法不是线程安全的。

在课程文档中,您可以在线程安全下找到此标准短语:

  

“此类型的任何公共静态(在Visual Basic中为Shared)成员都是   线程安全。任何实例成员都不能保证是线程   安全“。

这意味着该类没有任何线程安全注意事项。

您需要同步对BindingList实例的任何访问。您可以将其与lock关键字一起使用:

lock(_sync) {
  myBindingList.Add(something);
}

变量_sync引用的对象用作锁的标识符,因此访问该列表的所有代码都必须使用相同的锁引用。通常使用对象实例:

private object _sync = new Object();

答案 2 :(得分:1)

System.Collections.Concurrent命名空间提供了几个线程安全的集合类,只要多个线程同时访问集合,就应该使用它们来代替System.Collections和System.Collections.Generic命名空间中的相应类型。

http://msdn.microsoft.com/en-us/library/system.collections.concurrent.aspx