C#中的并发集合

我正在寻找一种在C#中获得并发集合的方法,或者至少是一个支持并发枚举器的集合。 现在,当我迭代的集合发生变化时,我得到一个InvalidOperationException。 我可以深度复制该集合并使用私有副本,但我想知道是否有更好的方法

代码段:

foreach (String s in (List )callingForm.Invoke(callingForm.delegateGetKillStrings)) { //do some jazz } 

– 编辑 –

我接受了答案,但也发现我需要确保写入集合的代码也需要尝试获取锁定。

  private void addKillString(String s) { lock (killStrings) { killStrings.Add(s); } } 

除了做一个深层复制,你最好的选择可能是锁定集合:

  List theList = (List )callingForm.Invoke(callingForm.delegateGetKillStrings); lock(theList.SyncRoot) { foreach(string s in theList) { // Do some Jazz } } 

所以我不太确定你在问什么,但Parallel Extensions团队已经把一些可能符合要求的东西放在一起。 特别是关于枚举并行集合的博客文章。 它还包含一个下载Parallel CTP的链接,您当然可以浏览其余的博客文章,以了解CTP的用途以及编程模型的工作原理。

如果要使用FCL集合,则锁定是支持可能重叠的多个线程的迭代/修改的唯一方法。

但是要小心你用作锁定对象的东西。 如果集合本身是使用它的类的私有成员,则使用SyncRoot只是一个好主意。 如果集合受到保护或公开,那么您的类的客户端可以对您的SyncRoot进行自己的锁定,可能会导致您的类中的代码死锁。

如果您有兴趣了解第三方collections库,我推荐优秀的C5通用collections库 。 它们有一系列基于树的集合,可以在不锁定的情况下轻松安全地进行修改和迭代 – 有关详细信息,请参阅其(优秀)文档的8.10和9.11节。