迭代不同线程的集合

时间:2011-04-15 05:07:14

标签: .net multithreading

我有一些线程,它添加,删除,从一个List中选择,显然,我得到Exception:InvalidOperationException,因为另一个操作导致集合被更改。所以,据我所知,我的代码设计不好等等。 这是个问题: 什么是这种情况下的轻松方式,如何在不重写整个代码的情况下改善情况?

2 个答案:

答案 0 :(得分:1)

如果您只需要同时插入,更新和删除,您可以编写自己的IList<T>实现,它聚合常规列表并使用lock(...)来保护所有读写操作(如Contains) ,添加等)。

也可以安全地枚举列表,但是要求您复制其内容而不是仅仅将枚举器返回到内部列表。

您还可以查看在.NET 4.0中使用新的并发集合。虽然没有ConcurrentList<T>,但您可以使用ConcurrentQueue<T>代替。

答案 1 :(得分:0)

最简单的方法是使用lock构造,如下所示:

lock(myList)
{
    myList.Add(somevalue);
}

这将一次只允许一个线程访问该列表。您需要lock在任何地方使用该列表才能安全。