我有一些线程,它添加,删除,从一个List中选择,显然,我得到Exception:InvalidOperationException,因为另一个操作导致集合被更改。所以,据我所知,我的代码设计不好等等。 这是个问题: 什么是这种情况下的轻松方式,如何在不重写整个代码的情况下改善情况?
答案 0 :(得分:1)
如果您只需要同时插入,更新和删除,您可以编写自己的IList<T>
实现,它聚合常规列表并使用lock(...)
来保护所有读写操作(如Contains) ,添加等)。
也可以安全地枚举列表,但是要求您复制其内容而不是仅仅将枚举器返回到内部列表。
您还可以查看在.NET 4.0中使用新的并发集合。虽然没有ConcurrentList<T>
,但您可以使用ConcurrentQueue<T>
代替。
答案 1 :(得分:0)
最简单的方法是使用lock
构造,如下所示:
lock(myList)
{
myList.Add(somevalue);
}
这将一次只允许一个线程访问该列表。您需要lock
在任何地方使用该列表才能安全。