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