架构师_程序员_码农网

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 33012|回复: 2

[资料] ConcurrentDictionary对于新增及更新的支持

[复制链接]
发表于 2016-7-13 11:12:05 | 显示全部楼层 |阅读模式
开发环境:.NET 4.0以上

说明:
在NET Framework 4内的System.Collections.Concurrent命名空间。
正如在MSDN文檔,ConcurrentDictionary可实现一个线程安全的集合,可以由多个线程同时访问Key-value。
ConcurrentDictionary实现IDictionary<TKey, TValue>,并且它有一些独特的机制adding 、updating key/value。(下面是说明何时该用什么方法)

装况一:添加一个新的项目,只有当key不存在于字典中...
使用TryAdd。TryAdd接受键和值添加到字典中,如果该键不存在于字典中则返回fasle;若存在则返回true。
public bool TryAdd(TKey key, TValue value)

状况二:更新现有的key在字典中的Value...
使用TryUpdate。字典若有该key,并且给予条件式的更新,在这方法中要给予一个比较值当目前的值等同比较值(TValue comparisonValue)时则可以更新。
public bool TryUpdate(TKey key, TValue newValue, TValue comparisonValue)


状况三:一个key/value要添加到字典中;如果该键不确定是否存在于字典中;若有存在则更新不存在则新增...

使用AddOrUpdate。AddOrUpdate有两个重载,两种重载接返会回value的值:
第一个重载的参数为AddOrUpdate(TKey, Func<TKey, TValue>, Func<TKey, TValue, TValue>)
参数为Key以及两个委派;第一个委派的目的是当key不存在时所执行的委派并返回value(初始value)此委派Func<返回初始value, key>。
第二个委派Func<返回Value, key,oldValue>如果该key不存在于字典中则执行第一个委派(若存在则不跑;目的是给value初始值),然后会要return value(value的初始值);第二个委派是针对value值变化的方法,一样要return  value(更改初始的value,为最后得到的value)。Func<返回Value, key, oldValue>
public TValue AddOrUpdate(TKey, Func<TKey, TValue>, Func<TKey, TValue, TValue>)

                 2.第二个重载的参数为AddOrUpdate(TKey, TValue, Func<TKey, TValue, TValue>)
第一个参数为key,第二个参数是当key不存在时,则此值为value的初始值,第三个为委派是执行变化(Func<返回Value, key,oldValue>)。
                      public TValue AddOrUpdate(TKey, TValue, Func<TKey, TValue, TValue>)

状况四:在字典中要添加key的值,但若是key已经存在则取出value;否则则新增
第一个重载:GetOrAdd(TKEY,Func<TKey, TValue>valueFactory)
第一个参数为key,第二个参数为委派Func<value, key>,当key不存在时传入一变量为key,在对value做变化。并建立key及value,返回一value值。

       2.第二个重载:GetOrAdd(TKEY,TValue)
第一个参数为key,第二个参数的目的是当key不存在时要新建key所给予的value。返回value。
public TValue GetOrAdd(TKEY,Func<TKey, TValue>valueFactory)
public TValue GetOrAdd(TKEY,TValue)


AddOrUpdate和GetOrAdd的每个操作对于修改/写入到字典中,ConcurrentDictionary所拥有的方法,可以确保线程安全(无锁的方式进行,在字典中读取数据)。




上一篇:LINQ 多条件查询 where 条件组建
下一篇:windows下面memcached的基本操作命令
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 2016-9-13 13:33:25 | 显示全部楼层
ConcurrentDictionary 对决 Dictionary+Locking - Dennis Gao
http://www.itsvse.com/thread-3106-1-1.html
(出处: 码农网)
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 2021-3-23 11:32:18 | 显示全部楼层
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2024-4-25 23:09

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表