【发布时间】:2013-09-22 22:39:36
【问题描述】:
我有一个BindingList,我将在两个不同的线程中填充...是否使用BindingList.Add() 方法ThreadSafe?
【问题讨论】:
标签: c# multithreading list collections thread-safety
我有一个BindingList,我将在两个不同的线程中填充...是否使用BindingList.Add() 方法ThreadSafe?
【问题讨论】:
标签: c# multithreading list collections thread-safety
不,Collection<T>.Add 不是线程安全的。
MSDN 通常在类文章中而不是在单个方法中介绍线程安全。 IE。为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
【讨论】: