线程安全与字典

问题描述:

如果我有一个线程安全与字典

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

一个线程执行

myDic[0] = new StreamReader(path); 

另一个线程做

myDic[1] = new StreamReader(otherpath) 

因为在字典中的实际项目越来越这是线程安全的修改是不同的另一个线程上或我会得到一个InvalidOperationException: Collection was modified

如果您在枚举字典修改时,您将只能得到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?请详细说明 –

要改善您的代码,您可能需要查看ConcurrentDictionary类。它将解决多线程的一些问题。

System.Collections.Generic集合只有线程安全,如果您正在从多个线程读取。

从MSDN

报价

System.Collections.Generic集合类不提供任何线程同步;用户代码必须提供所有同步时,项目被添加或多个线程取出同时

如果你想不想线程安全的读取和写入操作可以考虑使用System.Collections.Concurrent

* 当你编写新的代码,使用并发集合类,只要集合将同时写入多个线程。 *