2015-07-11 95 views
1

我不明白我的代碼是如何出了錯這裏有一個代碼塊:parallel.foreach和字典集合

var filter=new dictionary<string,dictionary<string,bool>>(); 
//data here is of type dictionary<string,bool> 
Parallel.Foreach(data,t=> 
{ 
var filter1=data.Where(p=>p.Value).ToDictionary(p=>p.Key,p=>p.Value); 
filter.Add(t.key,filter1); 
}); 

有時候,最終過濾器中有一個空的關鍵,如果我用了這從來沒有發生過一個簡單的循環。

回答

3

如果我使用了簡單的for循環,[這]從來沒有發生過。

問題是,您正在同時添加到filter。您可以通過使用AsParallel()解決這個問題:

var filter = data.AsParallel().ToDictionary(t => 
    t.Key 
, data.Where(p=>p.Value).ToDictionary(p=>p.Key, p=>p.Value) 
); 
+0

謝謝你,工作,但你能告訴我爲什麼該方法的表現就像是,我就算是同時添加數據,有數據沒有空的關鍵原因,那麼並行類如何創建一些本不應該存在的虛構任務 – JokingBear

+0

@JokingBear當字典被同時修改時,其內部數據結構將變得無效,特別是當桶重新平衡時。併發更新會寫入彼此的數據,因此即使非'null'項已提供給「Add」方法,鍵和/或值也會顯示爲「null」。事實上,你不能合法地向字典傳遞'null'鍵而不觸發異常。 – dasblinkenlight