当前位置: 首页 > news >正文

.NET 5种线程安全集合

在.NET中,有许多种线程安全的集合类,下面介绍五种我们常用的线程安全集合以及他们的基本用法。

ConcurrentBag

ConcurrentBag 是一个线程安全的无序包。它适用于在多线程环境中频繁添加和移除元素的情况。

ConcurrentBag<int> concurrentBag = new ConcurrentBag<int>();// 添加元素
concurrentBag.Add(1);// 尝试添加元素
concurrentBag.TryAdd(2);// 移除元素
int item;
concurrentBag.TryTake(out item);

ConcurrentQueue

ConcurrentQueue 是一个线程安全的无序队列。它适用于在多线程环境中频繁添加元素和移除元素(通常是先进先出方式)的情况。

ConcurrentQueue<int> concurrentQueue = new ConcurrentQueue<int>();// 添加元素
concurrentQueue.Enqueue(1);// 尝试添加元素
bool isSuccess = concurrentQueue.TryEnqueue(2);// 移除元素
int item;
bool isRemoved = concurrentQueue.TryDequeue(out item);

ConcurrentStack

ConcurrentStack 是一个线程安全的堆栈。它适用于在多线程环境中频繁添加元素和移除元素(通常是后进先出方式)的情况。

ConcurrentStack<int> concurrentStack = new ConcurrentStack<int>();// 添加元素
concurrentStack.Push(1);// 尝试添加元素
bool isSuccess = concurrentStack.TryPush(2);// 移除元素
int item;
bool isRemoved = concurrentStack.TryPop(out item);

ConcurrentDictionary<TKey, TValue>

ConcurrentDictionary<TKey, TValue> 是一个线程安全的字典。它适用于在多线程环境中频繁添加、移除和查找键值对的情况。

ConcurrentDictionary<int, string> concurrentDictionary = new ConcurrentDictionary<int, string>();// 添加或更新键值对
concurrentDictionary.AddOrUpdate(1, "One", (key, oldValue) => "NewOne");// 尝试添加或更新键值对
bool isSuccess = concurrentDictionary.TryAdd(2, "Two");
bool isUpdated = concurrentDictionary.TryUpdate(2, "NewTwo", "Two");// 移除键值对
string removedValue;
bool isRemoved = concurrentDictionary.TryRemove(1, out removedValue);// 获取值
string value;
bool isFound = concurrentDictionary.TryGetValue(1, out value);

BlockingCollection

BlockingCollection 是线程安全的集合,提供了可阻塞的添加和移除方法

BlockingCollection<int> blockingCollection = new BlockingCollection<int>();// 添加元素,如果集合已满,则阻塞当前线程
blockingCollection.Add(1);// 移除元素,如果集合为空,则阻塞当前线程
int item = blockingCollection.Take();

 

 

相关文章:

  • 数学专题3 - 质因数分解
  • 凡人修仙传8w字大纲pdf
  • 线程池详解并使用Go语言实现 Pool
  • python docx 添加动态表格
  • 从汇编看函数调用
  • 008 CSS盒子模型
  • 如何成为一名嵌入式C语言高手?
  • 突破编程_前端_SVG(概述)
  • 通俗易懂的理解 ADC(2)
  • zabbix绑定钉钉进行通知,网页端添加JavaScript,无脑式操作
  • sharo反序列化漏洞
  • 算法| ss 双指针
  • CentOS7安装Tomcat
  • 如何在plesk面板安装域名付费SSL证书
  • 云原生架构(微服务、容器云、DevOps、不可变基础设施、声明式API、Serverless、Service Mesh)
  • express.js的介绍及使用
  • Swoft 源码剖析 - 代码自动更新机制
  • WordPress 获取当前文章下的所有附件/获取指定ID文章的附件(图片、文件、视频)...
  • 翻译--Thinking in React
  • 高程读书笔记 第六章 面向对象程序设计
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 悄悄地说一个bug
  • 使用agvtool更改app version/build
  • 手机端车牌号码键盘的vue组件
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • ​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • # 深度解析 Socket 与 WebSocket:原理、区别与应用
  • #1014 : Trie树
  • (SpringBoot)第二章:Spring创建和使用
  • (九)One-Wire总线-DS18B20
  • (十三)Maven插件解析运行机制
  • (转)linux 命令大全
  • (转)如何上传第三方jar包至Maven私服让maven项目可以使用第三方jar包
  • (转)四层和七层负载均衡的区别
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • *2 echo、printf、mkdir命令的应用
  • .NET Framework与.NET Framework SDK有什么不同?
  • .net 提取注释生成API文档 帮助文档
  • .NET 中的轻量级线程安全
  • .NET 中让 Task 支持带超时的异步等待
  • .Net环境下的缓存技术介绍
  • .net连接MySQL的方法
  • .NET中的Exception处理(C#)
  • .sh 的运行
  • @DependsOn:解析 Spring 中的依赖关系之艺术
  • @kafkalistener消费不到消息_消息队列对战之RabbitMq 大战 kafka
  • [ C++ ] STL_stack(栈)queue(队列)使用及其重要接口模拟实现
  • [ MSF使用实例 ] 利用永恒之蓝(MS17-010)漏洞导致windows靶机蓝屏并获取靶机权限
  • [ vulhub漏洞复现篇 ] AppWeb认证绕过漏洞(CVE-2018-8715)
  • [ 渗透工具篇 ] 一篇文章让你掌握神奇的shuize -- 信息收集自动化工具
  • [].shift.call( arguments ) 和 [].slice.call( arguments )
  • [20160807][系统设计的三次迭代]