2016-07-11 1 views
0

私は文字列リストList<string> mylistを持っています。このリストに文字列を追加するバックグラウンド操作があります。 私は、これはタイマ動作はファイルを追加すると、この例外オーバーコレクションの取得が変更されました。列挙操作が実行されない可能性があります

Collection was modified; enumeration operation may not execute 

に私はループを押す前に、ファイルの完全なリストを取得することはできません結果

foreach (string pfile in mylist) 
{ 
//dostuff 
} 

このリスト内の文字列を処理するために、別のバックグラウンド操作を使用しますこの問題を回避するにはどうすればよいですか?アドバイスをしてください。

+0

あなたが使用することをお勧めします[他の何か'List '](https://msdn.microsoft.com/en-us/library/dd997305(v = vs.110).aspxより) –

答えて

0

何らかのロックを設定する必要があります。

private object _locker = new object(); // Class member object 

void ProcessList() // Or whatever it's called 
{ 
    lock (_locker) 
    { 
     foreach (string pfile in mylist) 
     { 
      //dostuff 
     } 
    } 
} 

同じ_lockerオブジェクトを使用して、あなたもlockに他のスレッドの追加アクティビティをラップすることを確認してください。

//dostuffコードは長い時間がかかる場合は、リストがロックされている時間の量を最小限にするために、リストのコピー上で動作して検討する必要がありますが:

string[] mylistCopy; 

    lock (_locker) 
    { 
     mylistCopy = mylist.ToArray(); 
    } 

    foreach (string pfile in mylistCopy) 
    { 
     //dostuff 
    } 
関連する問題