2011-11-18 109 views
12

如果我有一個線程安全與字典

Dictionary<int, StreamReader> myDic = new Dictionary<int, StreamReader> 
//Populate dictionary 

一個線程執行

myDic[0] = new StreamReader(path); 

另一個線程做

myDic[1] = new StreamReader(otherpath) 

因爲在字典中的實際項目越來越這是線程安全的修改是不同的另一個線程上或我會得到一個InvalidOperationException: Collection was modified

回答

18

如果您在枚舉字典修改時,您將只能得到InvalidOperationException: Collection was modified

但是,這不是線程安全的。
如果其中一個操作導致字典調整大小,另一個可能會丟失。
改爲使用ConcurrentDictionary

+0

,如果我有cuncorrentDictionary,我需要檢查的containsKey然後如果真正做一些事情:然後我仍然不得不將其鎖定:鎖定'(櫃) { 如果(MyConDic.ContainsKey(toUserName) ) {...}}'....不是? –

+0

@RoyiNamir:這破壞了'ConcurrentDictionary'的整個目的。使用它的API – SLaks

+0

但誰保證在96行不會是另一個線程,將增加entery?http://i.stack.imgur.com/MwDuU.jpg?請詳細說明 –

1

要改善您的代碼,您可能需要查看ConcurrentDictionary類。它將解決多線程的一些問題。

5

System.Collections.Generic集合只有線程安全,如果您正在從多個線程讀取。

從MSDN

報價

System.Collections.Generic集合類不提供任何線程同步;用戶代碼必須提供所有同步時,項目被添加或多個線程取出同時

如果你想不想線程安全的讀取和寫入操作可以考慮使用System.Collections.Concurrent

* 當你編寫新的代碼,使用併發集合類,只要集合將同時寫入多個線程。 *