0

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

4

3 回答 3

4

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

MSDN 通常在类文章而不是单个方法中涵盖线程安全。即收集

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

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

于 2013-09-22T22:43:32.437 回答
2

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

在该类的文档中,您可以在线程安全下找到这个标准短语:

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

这意味着该类没有任何线程安全考虑。

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

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

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

private object _sync = new Object();
于 2013-09-22T22:47:20.647 回答
1

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

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

于 2013-09-22T22:46:37.397 回答