Threadsafe和通用arraylist?

时间:2009-08-14 13:59:42

标签: c# .net collections multithreading thread-safety

我希望有一个通用的线程安全集合,我看到Arraylist可以很容易地通过其静态Synchronized方法使用线程安全,但是我的错误是这个ArrayList不是通用的所以当我想使用我的对象我总是必须施展它们。有更简单的方法吗?其他列表类型也是可能的。

3 个答案:

答案 0 :(得分:3)

如果您在MSDN上阅读有关同步方法的内容,仍然会这样说:

“通过集合枚举本质上不是一个线程安全的过程。即使集合是同步的,其他线程仍然可以修改集合,这会导致枚举器抛出异常。为了保证枚举期间的线程安全,你可以要么在整个枚举期间锁定集合,要么捕获由其他线程所做的更改导致的异常。“

答案 1 :(得分:3)

您可以创建一个List(T)包装器并使用SyncRoot属性同步访问。

MSDN示例:

ICollection ic = ...;
lock (ic.SyncRoot) 
{
    // Access the collection.
}

答案 2 :(得分:3)

一点知识是危险的;-)是的,你可以使用Meta-Knight的建议并使用SyncRoot,但你需要小心 - 它不是灵丹妙药。请参阅Microsoft的BCL团队博客中的this post,了解为什么它不像SyncRoot那么简单。该帖子引用:

  

我们的通用的一些精明的用户   收藏品观察到我们不再   提供公共SyncRoot财产   ICollection<T>

  

我认为我们的强迫会更好   人们要更加重视   同步,坦率地说   我们的通用的SyncRoot属性   集合不提供任何价值。

当然,这并不是说它在任何情况下都不能使用 - 你只需仔细考虑用例,而不是自动驾驶。