2011-11-19 57 views
1

我有一个Dictionary<int, bool>LINQ和字典线程安全

我有一个InvalidOperationException collection was modified错误被处理,但难倒我为什么。

我想是的,唯一的代码是以下:

lock (lockObject) 
{ 
    AllowInputs[InputNumber] = true; 
} 

if (AllowInputs.Values.All(x => x == true)) 
{ 
    //Do stuff 
} 

如果一个线程是锁定的语句修改值内而另一个线程正在执行All(x => x == true)这将导致"Collection was modified" errror?

回答

3

是的,当你阅读和写作时,你需要锁定(在同一个对象上)。对All的调用内部迭代字典中的所有项目。如果字典被另一个线程修改,则迭代器将变为无效并抛出异常。

试试这个:

lock (lockObject) 
{ 
    if (AllowInputs.Values.All(x => x == true)) 
    { 
     //Do stuff 
    } 
} 
+0

谢谢,我将移动lock语句的结尾以包含All方法调用 – Jon

1

是的,你需要或者是可以让你有一个作家和多个读者当你读或写或可考虑the reader writer pattern的对象锁定:

即,如果您在同一个对象上执行多个读取操作。