我有一个BindingList,我将在两个不同的线程中填充它......正在使用BindingList.Add()方法 ThreadSafe?
3 回答
不,Collection<T>.Add
不是线程安全的。
MSDN 通常在类文章而不是单个方法中涵盖线程安全。即收集
一个 Collection 可以同时支持多个读取器,只要不修改集合即可。即便如此,通过集合枚举本质上不是线程安全的过程。为了保证枚举过程中的线程安全,可以在整个枚举过程中锁定集合。要允许集合被多个线程访问以进行读写,您必须实现自己的同步。
请注意,您不能说接口的方法是否是线程安全的,因为接口没有定义任何线程安全要求,它只指定方法签名。您需要检查每个单独的实现是否对线程安全有任何特定保证。
不,该BindingList.Add
方法不是线程安全的。
在该类的文档中,您可以在线程安全下找到这个标准短语:
“这种类型的任何公共静态(在 Visual Basic 中为共享)成员都是线程安全的。不保证任何实例成员都是线程安全的。”
这意味着该类没有任何线程安全考虑。
您需要同步对BindingList
实例的任何访问。您可以将其与lock
关键字一起使用:
lock(_sync) {
myBindingList.Add(something);
}
变量_sync
引用的对象用作锁的标识符,因此访问该列表的所有代码都必须对锁使用相同的引用。通常使用对象实例:
private object _sync = new Object();
System.Collections.Concurrent 命名空间提供了几个线程安全的集合类,当多个线程同时访问集合时,应该使用它们来代替 System.Collections 和 System.Collections.Generic 命名空间中的相应类型。
http://msdn.microsoft.com/en-us/library/system.collections.concurrent.aspx