C# C语言中的并发集合#

C# C语言中的并发集合#,c#,concurrency,C#,Concurrency,我正在寻找一种在C#中获取并发集合的方法,或者至少是一种支持并发枚举器的集合。现在,当我迭代的集合发生更改时,我得到了一个invalidoOperationException 我可以深度复制藏品,然后使用私人复制品,但我想知道是否有更好的方法 代码段: foreach(调用form.Invoke(调用form.delegateGetKillStrings)(列表)中的字符串s) { //演奏爵士乐 } --编辑-- 我接受了答案,但也发现我需要确保写入集合的代码也需要尝试获取锁 private

我正在寻找一种在C#中获取并发集合的方法,或者至少是一种支持并发枚举器的集合。现在,当我迭代的集合发生更改时,我得到了一个
invalidoOperationException

我可以深度复制藏品,然后使用私人复制品,但我想知道是否有更好的方法

代码段:

foreach(调用form.Invoke(调用form.delegateGetKillStrings)(列表)中的字符串s)
{
//演奏爵士乐
}
--编辑--

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

private void addKillString(字符串s)
{
锁(killStrings)
{
killStrings.Add(s);
}
}

除了进行深度复制,最好的办法可能是锁定收藏:

   List<string> theList = (List<String> )callingForm.Invoke(callingForm.delegateGetKillStrings);
    lock(theList.SyncRoot) {
        foreach(string s in theList) {
               // Do some Jazz
        }
    }
List theList=(List)callingForm.Invoke(callingForm.delegateGetKillStrings);
锁定(列表同步根){
foreach(列表中的字符串s){
//演奏爵士乐
}
}

所以我不太确定你在问什么,但并行扩展团队已经准备好了一些东西,可能符合要求。请特别参阅此博客文章,关于。它还包含一个下载并行CTP的链接,您当然可以浏览其余的博客文章,了解CTP的作用以及编程模型的工作原理。

如果您想使用FCL集合,那么,锁定是支持来自可能重叠的多个线程的迭代/修改的唯一方法

不过,要小心使用什么作为锁定对象。只有当集合本身是使用它的类的私有成员时,使用SyncRoot才是一个好主意。如果集合是受保护的或公共的,则类的客户端可以在SyncRoot上拥有自己的锁,这可能会导致类中的代码死锁

如果您有兴趣查看第三方收藏库,我推荐优秀的。他们有一系列基于树的集合,可以轻松、安全地同时修改和迭代,而无需锁定-有关详细信息,请参见他们(优秀)文档的第8.10节和第9.11节