.NET フレームワーク 3.5
同じジェネリック コレクションを使用する 2 つのスレッドがあります。foreach
次のステートメントを使用して、1 つのスレッドがコレクションをループします。
while(HaveToContinue)
{
// Do work 1
try
{
foreach(var item in myDictionary)
{
// Do something with/to item
}
// Do work 2 (I need to complete the foreach first)
}
catch(InvalidOperationException)
{
}
}
同時に、他のスレッドがコレクションを変更します。
// The following line causes the InvalidOperationException (in the foreach)
myDictionary.Remove(...);
それで、これを避ける方法はありInvalidOperationException
ますか?この例外を回避できれば、作業 (作業 1 + 作業 2) を常に完了できますが、例外をキャッチするたびに作業を完了できません。
ManualResetEvent
次のようなオブジェクトを使用することを考えました。
while(HaveToContinue)
{
// Do work 1
try
{
myResetEvent.Reset();
foreach(var item in myDictionary)
{
// Do something with/to item
}
myResetEvent.Set();
// Do work 2 (I need to complete the foreach first)
}
catch(InvalidOperationException)
{
}
}
そして、他のスレッドがコレクションを変更するたびに:
// Expect the foreach is completed
myResetEvent.WaitOne();
// And then modify the collection
myDictionary.Remove(...);
しかし、おそらくもっと良い解決策があります。