InvalidOperationException:集合已修改

时间:2012-03-12 06:17:48

标签: c# exception collections dictionary

我知道在迭代它时我无法修改它。

通常我会复制我想要迭代的集合,然后遍历副本以避免错误。

我的节目;但是,对我正在试图复制的集合进行了大量快速修改。

错误是否正在发生,因为我在修改父集合时正在制作副本?

我知道ConcurrentDictionary为交叉线程提供了某种锁定机制。我可以使用类似的东西来防止这个错误吗?

    // Original collection:
    Dictionary<string, Enemy> Dict_Enemies = new Dictionary<string, Enemy>();

    // Copy of original collection: (this line throws the exception)
    Dictionary<string, Enemy> Dict_Enemies_Copy = new Dictionary<string, Enemy>(Dict_Enemies);

4 个答案:

答案 0 :(得分:2)

尝试使用Dict_Enemies // Original collection: var Dict_Enemies = new ConcurrentDictionary<string, Enemy>(); // Thread-safe copy: ICollection<KeyValuePair<string, Enemy>> Dict_Enemies_Copy = Dict_Enemies.ToArray(); 来允许从多个线程修改它。然后使用ConcurrentDictionary方法在线程安全操作中复制它:

{{1}}

答案 1 :(得分:1)

Dictionary<K,V>不支持多个并发编写器,这意味着您必须已有锁。只需确保在持有锁定的同时创建副本。

答案 2 :(得分:0)

将此字典封装为类的私有成员,并使用锁(在两个位置使用相同的锁对象,可能是字典本身)以确保写入和副本不会同时发生。不允许在其他任何地方直接访问字典。

答案 3 :(得分:0)

但类似的代码对我来说非常有用.....你能不能对你的代码作出更多解释?

  Dictionary<int, Test> dicOrg = new Dictionary<int, Test>();//Original
  dicOrg.Add(1, new Test() {id= 1,name="name",add="add"});
  Dictionary<int, Test> dicCopy = new Dictionary<int,Test>(dicOrg);//Copy of dicOrg