带字典的线程安全

本文关键字:安全 线程 字典 | 更新日期: 2023-09-27 18:15:01

如果我有

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

System.Collections.Generic集合只有在从多个线程读取时才是线程安全的。

引用MSDN

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

如果您希望读取和写入操作都具有线程安全性,请考虑使用System.Collections.Concurrent

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

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