2009-08-03 19 views
2

最近、 "列挙子がインスタンス化された後にコレクションが変更されました"というエラーが発生しました。理由はわかりません。エラーはweb.configを指定します。このエラーの原因は何ですか?「列挙子がインスタンス化された後にコレクションが変更されました」というエラーが発生する原因は何ですか?

私はそれを再現できませんでした。このエラーは非常にまれであり、ランダムではありません。私のプログラムはファイルを取り込み、それを処理します。このエラーが表示されたら、単にプログラムを再実行しても問題ありません。

プログラムの実行中にweb.configを変更していると思っていますか?私のプログラムはいくつかのデータベース(sql、db2、oracle)に接続するので、完了するまでに数秒かかることがあります。その時にweb.configに触れる何かが原因でしょうか、間違った領域を見ていますか?

編集:私はweb.configファイルから接続文字列を読み取ろうとしましたし、ライン59が含まれている場合、それは起こったスタックトレースを見てみると

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 

:ここ

は、エラーに関する追加情報があります読み取られている接続文字列情報。

これは、ループ内のコレクションを変更するためのものですか?

私はコレクションにアイテムを追加しますが、ループではなく、スタックトレースが表示されている場所の近くには追加しません。コレクションからアイテムを削除しません。

+0

これは通常、あなたがコレクションでイテレータを設定することを意味するが、その後、内からコレクションを変更しますイテレータを無効にします。以前はweb.configファイルにこのようなことがあったわけではありません。 –

答えて

10

コレクションを反復している間(つまりforeach内で)コレクションを変更することはできません。

したがって、foreachブロック内でコレクションにアイテムを追加または削除するとこのエラーが発生します。

web.configのエラーとして、別の場所で定義された重複キーを追加しているか、コード内で設定を動的に変更しようとしている可能性があります。

+3

+代わりに整数インデックスを使用してコレクションを逆方向に繰り返します。これにより、必要に応じて削除を行うことができます。 –

+0

私は、このエラーが設定ファイルと何か関係があるとは思わない。 foreachを使って処理しているコレクションを見ると、問題を見つけることができるはずです。 –

+0

この場合、エラーは一貫して発生しませんか?このエラーは非常にまれであり、私はプロセスを通して全く同じファイルを実行してもエラーを表示させることができませんでした。 – dtc

1

web.configへの参照はおそらく詳細なエラーを有効にすることです。表示されている指示に従うと、エラーが発生したページと行番号が表示されます。このエラーは、一般的にこのようなitteratorの内側にコレクションを変更する(前述したように)のいずれかから発生している:

List<string> myList = new List<string>(); 
myList.Add(some strings); 
foreach(string s in myList){ 
    myList.Remove(s); // <-- EXCEPTION 
}