繁体   English   中英

是ICollection吗 <T> 。添加ThreadSafe吗?

[英]Is ICollection<T>.Add ThreadSafe?

我有一个的BindingList那我会在两个不同的线程来填充......使用BindingList.Add()方法ThreadSafe的?

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

MSDN通常在类文章而不是单个方法中介绍线程安全。

一个Collection可以同时支持多个阅读器 ,只要不修改Collection即可。 即使这样,通过集合枚举本质上也不是线程安全的过程。 为了保证枚举期间的线程安全,您可以在整个枚举期间锁定集合。 要允许多个线程访问该集合进行读写,必须实现自己的sync

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

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

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

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

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

您需要同步对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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM