Что вызывает ошибку «Коллекция была изменена после создания экземпляра перечислителя»? - PullRequest
2 голосов
/ 03 августа 2009

Недавно я столкнулся с ошибкой «Коллекция была изменена после создания экземпляра перечислителя», и я понятия не имею, почему. Ошибка указывает на web.config. Что вызывает эту ошибку?

Я не смог воспроизвести это. Ошибка выскакивает очень редко и случайно. Моя программа берет файл и обрабатывает его. Когда я получаю эту ошибку, я просто перезапускаю программу, и все в порядке.

Я думаю, что что-то модифицирует мой web.config во время работы моей программы? Моя программа подключается к нескольким базам данных (sql, db2 и oracle), поэтому иногда это может занять несколько секунд. Может ли что-то касаться web.config в это время быть причиной, или я смотрю не в ту область?

Edit:

Вот дополнительная информация об ошибке:

Type : System.Configuration.ConfigurationErrorsException, System.Configuration,    Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Message : An error occurred loading a configuration file: Collection was modified after the enumerator was instantiated. (<path>\web.config line 59)
Source : System.Configuration
Help link :
BareMessage : An error occurred loading a configuration file: Collection was modified after the enumerator was instantiated.
Filename : <path>\web.config
Line : 59
Errors : System.Configuration.ConfigurationException[]
Data : System.Collections.ListDictionaryInternal

Глядя на трассировку стека, это произошло, когда я попытался прочитать строку подключения из файла web.config, а строка 59 содержит информацию о строке подключения, которая читается.

Похоже ли это из-за изменения коллекции в цикле?

Я добавляю элементы в коллекцию, но не в цикле, и нигде рядом с местом, где отображается трассировка стека Я не удаляю предметы из коллекций.

Ответы [ 2 ]

10 голосов
/ 03 августа 2009

Вы не можете изменить коллекцию во время итерации по ней (то есть в foreach).

Таким образом, добавление или удаление элементов из коллекции внутри блока foreach приведет к этой ошибке.

В качестве ошибки в файле web.config может оказаться, что вы добавляете дублирующий ключ, определенный в другом месте, или пытаетесь динамически изменить конфигурацию в своем коде.

1 голос
/ 04 августа 2009

ссылка на web.config, вероятно, для включения подробных ошибок. Если вы будете следовать приведенным инструкциям, он покажет вам страницу и номер строки, где произошла ошибка. Эта ошибка обычно возникает из-за (как упоминалось ранее) изменения коллекции внутри итератора, например:

List<string> myList = new List<string>();
myList.Add(some strings);
foreach(string s in myList){
  myList.Remove(s); // <-- EXCEPTION 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...