InvalidOperationException: коллекция была изменена - PullRequest
2 голосов
/ 12 марта 2012

Я знаю, что не могу изменить коллекцию во время итерации по ней.

Обычно я делаю копию коллекции, которую хочу перебрать, затем перебираю копию, чтобы избежать ошибок.

Моя программа; однако, я делаю множество быстрых изменений в коллекции, копию которой пытаюсь создать.

Может ли быть ошибка, потому что я делаю копию во время изменения родительской коллекции?

Я знаю, что 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 ]

2 голосов
/ 12 марта 2012

Попробуйте использовать ConcurrentDictionary для Dict_Enemies, чтобы разрешить его изменение из нескольких потоков. Затем сделайте его копию в поточно-ориентированной операции , используя метод ToArray () :

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

// Thread-safe copy:
ICollection<KeyValuePair<string, Enemy>> Dict_Enemies_Copy = Dict_Enemies.ToArray();
1 голос
/ 12 марта 2012

A Dictionary<K,V> не поддерживает несколько одновременно работающих писателей, что означает, что у вас уже должна быть блокировка.Просто убедитесь, что вы создали свою копию, удерживая этот замок.

0 голосов
/ 12 марта 2012

Но подобный код прекрасно работает для меня ..... Не могли бы вы дать более подробное описание своего кода ???

  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
0 голосов
/ 12 марта 2012

Инкапсулируйте этот словарь как закрытый член класса и используйте блокировку (с одним и тем же объектом блокировки в обоих местах, возможно, самим словарем), чтобы гарантировать, что записи и копии не происходят одновременно.Не разрешайте прямой доступ к словарю где-либо еще.

...