现在有一个dictionary集合 ,动态的往里添加、修改、查询数据,且这个集合很大。
目前的做法是lock这个集合,再修改,查询。数据量大的时候,lock后,去遍历,耗费的时间太多,能否有个跟好的方法多线程异步操作dictionary集合

解决方案 »

  1.   

    用Net实现好的线程安全字典试试
    System.Collections.Generic.SynchronizedKeyedCollection
      

  2.   

    什么叫lock这个集合,为什么要遍历dict?
      

  3.   

    dictionary本身就是线程安全的?我似乎记得msdn这么说,你可以试试看不加任何lock,也许可以,
      

  4.   


    不行的哦  当我遍历修改时,又有新的数据add进来,集合长度改变,foreach就会报异常:集合已修改
      

  5.   

    a
    这个是foreach的实现原理造成的,既然你用了字典,为什么不用key,而是去遍历?
      

  6.   


    嗯,谢谢了。如果我按条件查询的时候不是根据key,是根据value对象的某个字段查询,如果这样:
    去遍历Dic.value,修改,同时Dic动态新增,会不会也发生直接遍历dic引发的问题
      

  7.   

    可能是我没有说清楚,根据key查询  是没有问题,主要的问题是查询到这个对象后,我要修改这个对象的值
      

  8.   

    你需要通过value去查询,那么就再建立一个以value为key的字典,其值是原Key(或多个Key组合)。
    这就好比给数据库的表建索引,原来的Key是主键,而新建的则是索引。
    对于原始的字典,如果要求不高的话,可以直接使用Dictionary类。但对于新建的索引字典,请使用ConcurrentDictionary,自己控制多线程修改的值替换情况。
      

  9.   


    不安全的,不过4.0以后有ConcurrentDictionary
      

  10.   

    用ReaderWriterLock锁,QQ:406485989
      

  11.   

    如果集合比较多,你应该应该想清楚了,是否需要经常性遍历?试下 hastable.
      

  12.   

     dicJson.Single(p => p.Key == "smallimg").Value.Single(p => p.Key == "value").Value
      

  13.   

    [MethodImpl(MethodImplOptions.Synchronized)]加这个特性
      

  14.   

    多线程程序中推荐使用 Hashtable, 默认的 Hashtable 允许单线程写入, 多线程读取, 对 Hashtable 进一步调用 Synchronized() 方法可以获得完全线程安全的类型. 而 Dictionary 非线程安全, 必须人为使用 lock 语句进行保护, 效率大减http://www.cnblogs.com/zcy_soft/archive/2010/10/02/1841165.html春哥这么告诉大家的哈哈