.NET 框架 3.5
我有两个线程使用相同的通用集合。foreach
一个线程使用以下语句循环遍历集合:
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(...);
但可能有更好的解决方案。