2011-11-19 47 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的對象鎖定:

即,如果您在同一個對象上執行多個讀取操作。