我有一个BindingList,我将在两个不同的主题中填充...使用BindingList.Add()方法ThreadSafe?
答案 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