c# 多线程异步操作Dictionary' 现在有一个dictionary集合 ,动态的往里添加、修改、查询数据,且这个集合很大。目前的做法是lock这个集合,再修改,查询。数据量大的时候,lock后,去遍历,耗费的时间太多,能否有个跟好的方法多线程异步操作dictionary集合 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 用Net实现好的线程安全字典试试System.Collections.Generic.SynchronizedKeyedCollection 什么叫lock这个集合,为什么要遍历dict? dictionary本身就是线程安全的?我似乎记得msdn这么说,你可以试试看不加任何lock,也许可以, 不行的哦 当我遍历修改时,又有新的数据add进来,集合长度改变,foreach就会报异常:集合已修改 a这个是foreach的实现原理造成的,既然你用了字典,为什么不用key,而是去遍历? 嗯,谢谢了。如果我按条件查询的时候不是根据key,是根据value对象的某个字段查询,如果这样:去遍历Dic.value,修改,同时Dic动态新增,会不会也发生直接遍历dic引发的问题 可能是我没有说清楚,根据key查询 是没有问题,主要的问题是查询到这个对象后,我要修改这个对象的值 你需要通过value去查询,那么就再建立一个以value为key的字典,其值是原Key(或多个Key组合)。这就好比给数据库的表建索引,原来的Key是主键,而新建的则是索引。对于原始的字典,如果要求不高的话,可以直接使用Dictionary类。但对于新建的索引字典,请使用ConcurrentDictionary,自己控制多线程修改的值替换情况。 不安全的,不过4.0以后有ConcurrentDictionary 用ReaderWriterLock锁,QQ:406485989 如果集合比较多,你应该应该想清楚了,是否需要经常性遍历?试下 hastable. dicJson.Single(p => p.Key == "smallimg").Value.Single(p => p.Key == "value").Value [MethodImpl(MethodImplOptions.Synchronized)]加这个特性 多线程程序中推荐使用 Hashtable, 默认的 Hashtable 允许单线程写入, 多线程读取, 对 Hashtable 进一步调用 Synchronized() 方法可以获得完全线程安全的类型. 而 Dictionary 非线程安全, 必须人为使用 lock 语句进行保护, 效率大减http://www.cnblogs.com/zcy_soft/archive/2010/10/02/1841165.html春哥这么告诉大家的哈哈 请问大家,这段代码怎么解释? 读取时报错,“无法访问已关闭的文件” 动态生成Treeview C#读Excel数据问题 数字类型读出来之后不能转成数字 a.aspx.cs文件中用javascript无法调用a.aspx文件的对象? windows mobile5.0里开发,使用平台.net2005 ,c#语言。为什么在模拟器里布署完后,模拟器里页面中的汉字变成了乱码? 迷茫中,解救我吧 Spring.Net得问题 Activex控件引入执行错误!相关高手请进! textBox的一个问题 c#中get好set中value赋值的问题,先看一段代码吧 实现数字保留两位小数
System.Collections.Generic.SynchronizedKeyedCollection
不行的哦 当我遍历修改时,又有新的数据add进来,集合长度改变,foreach就会报异常:集合已修改
这个是foreach的实现原理造成的,既然你用了字典,为什么不用key,而是去遍历?
嗯,谢谢了。如果我按条件查询的时候不是根据key,是根据value对象的某个字段查询,如果这样:
去遍历Dic.value,修改,同时Dic动态新增,会不会也发生直接遍历dic引发的问题
这就好比给数据库的表建索引,原来的Key是主键,而新建的则是索引。
对于原始的字典,如果要求不高的话,可以直接使用Dictionary类。但对于新建的索引字典,请使用ConcurrentDictionary,自己控制多线程修改的值替换情况。
不安全的,不过4.0以后有ConcurrentDictionary