0

0

C#的ConcurrentBag和ConcurrentDictionary是什么?如何编写线程安全的集合操作?

星降

星降

发布时间:2025-11-12 17:35:02

|

882人浏览过

|

来源于php中文网

原创

ConcurrentBag是线程安全的无序集合,适合多线程下高效添加和取出元素,不保证顺序且允许重复,常用于生产者-消费者模式;ConcurrentDictionary是线程安全的键值对集合,通过细粒度锁或无锁机制提升并发读写性能,提供AddOrUpdate、GetOrAdd等原子操作,适用于高并发字典场景。

c#的concurrentbag和concurrentdictionary是什么?如何编写线程安全的集合操作?

ConcurrentBag 和 ConcurrentDictionary 是 C# 中用于多线程环境下安全操作集合的类,它们属于 System.Collections.Concurrent 命名空间,专为高并发场景设计,无需额外加锁即可保证线程安全。

ConcurrentBag 是什么?

ConcurrentBag 适合在多个线程中频繁添加和取出元素的场景。它不保证顺序,每个线程有自己的本地队列以减少竞争,适合“生产者-消费者”模式中的临时数据存储。

特点:
  • 允许重复元素
  • 不保证取出顺序(通常后进先出)
  • 添加和移除操作非常高效,尤其在多线程写入时

示例用法:

var bag = new ConcurrentBag();
Parallel.For(0, 1000, i =>
{
    bag.Add(i);
});

while (bag.TryTake(out int item)) { Console.WriteLine(item); }

ConcurrentDictionary 是什么?

ConcurrentDictionary 是线程安全的键值对集合,适用于多线程读写字典的场景。它通过细粒度锁或无锁机制提升性能,避免了使用普通 Dictionary 加锁带来的性能瓶颈

Bardeen AI
Bardeen AI

使用AI自动执行人工任务

下载
常用方法:
  • AddOrUpdate:原子性地添加或更新值
  • GetOrAdd:获取值,若不存在则添加
  • TryAdd/TryUpdate/TryRemove:安全尝试操作

示例用法:

var dict = new ConcurrentDictionary();

// 多个线程安全增加计数 Parallel.ForEach(items, item => { dict.AddOrUpdate(item, 1, (key, oldValue) => oldValue + 1); });

// 或使用 GetOrAdd 初始化 dict.GetOrAdd("key", k => ExpensiveCalculation());

如何编写线程安全的集合操作?

直接使用 Concurrent 集合类是最推荐的方式。它们已经过优化,比手动加锁更高效且不易出错。

建议做法:
  • 优先使用 ConcurrentDictionary、ConcurrentQueue、ConcurrentStack、ConcurrentBag 替代普通集合
  • 避免在遍历时修改集合,即使使用并发集合,foreach 可能仍会抛出异常或看到中间状态
  • 不要依赖操作顺序,除非使用有顺序保证的结构如 ConcurrentQueue(FIFO)
  • 复杂逻辑可结合 Interlocked 或 lock,但尽量利用现有并发类型提供的原子方法

基本上就这些。用好 ConcurrentBag 和 ConcurrentDictionary,大多数线程安全集合问题都能高效解决。关键是理解它们的适用场景,避免误用导致性能下降或逻辑错误。

相关专题

更多
php中foreach用法
php中foreach用法

本专题整合了php中foreach用法的相关介绍,阅读专题下面的文章了解更多详细教程。

70

2025.12.04

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

482

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

144

2025.12.24

java多线程相关教程合集
java多线程相关教程合集

本专题整合了java多线程相关教程,阅读专题下面的文章了解更多详细内容。

5

2026.01.21

C++多线程相关合集
C++多线程相关合集

本专题整合了C++多线程相关教程,阅读专题下面的的文章了解更多详细内容。

11

2026.01.21

c++ 根号
c++ 根号

本专题整合了c++根号相关教程,阅读专题下面的文章了解更多详细内容。

58

2026.01.23

c++空格相关教程合集
c++空格相关教程合集

本专题整合了c++空格相关教程,阅读专题下面的文章了解更多详细内容。

57

2026.01.23

yy漫画官方登录入口地址合集
yy漫画官方登录入口地址合集

本专题整合了yy漫画入口相关合集,阅读专题下面的文章了解更多详细内容。

237

2026.01.23

漫蛙最新入口地址汇总2026
漫蛙最新入口地址汇总2026

本专题整合了漫蛙最新入口地址大全,阅读专题下面的文章了解更多详细内容。

393

2026.01.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 7.5万人学习

C 教程
C 教程

共75课时 | 4.2万人学习

C++教程
C++教程

共115课时 | 13.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号