编辑
2025-09-18
C#
00

目录

ConcurrentBag简介
ConcurrentBag的特点
ConcurrentBag的构造函数
ConcurrentBag的常用方法
示例:使用ConcurrentBag
示例1:基本用法
示例2:使用ConcurrentBag存储任务的结果
总结

在多线程环境下,数据的线程安全是一个重要的考虑因素。C#提供了多种集合类型来支持线程安全的数据操作,其中ConcurrentBag<T>是一个非常有用的集合类型。本文将深入探讨ConcurrentBag<T>的特点、构造函数、常用方法,并通过实例来展示其用法。

ConcurrentBag简介

ConcurrentBag<T>是.NET Framework中System.Collections.Concurrent命名空间下的一个类,它表示一个线程安全的无序集合。ConcurrentBag<T>主要用于并发编程场景,特别是当多个线程需要添加和移除元素时,它提供了一种高效的方式来管理集合中的元素。

ConcurrentBag的特点

  • 线程安全ConcurrentBag<T>内部实现了必要的同步机制,确保了在并发环境下的线程安全性。
  • 无序集合:与List或Array不同,ConcurrentBag<T>不保证元素的顺序。元素的添加和移除操作可能会导致集合中元素的顺序发生变化。
  • 支持重复元素ConcurrentBag<T>允许添加重复的元素,这一点与HashSet等集合类型不同。
  • 高效的并发添加和移除操作ConcurrentBag<T>针对并发场景进行了优化,提供了高效的添加和移除元素的操作。

ConcurrentBag的构造函数

ConcurrentBag<T>提供了两个构造函数:

  1. ConcurrentBag():初始化ConcurrentBag<T>的新实例,该实例为空且没有初始容量。
  2. ConcurrentBag(IEnumerable collection):初始化ConcurrentBag<T>的新实例,该实例包含从指定的IEnumerable<T>复制的元素。

ConcurrentBag的常用方法

  • Add(T item):将一个对象添加到ConcurrentBag<T>中。
  • TryTake(out T result):尝试从ConcurrentBag<T>中移除并返回一个对象。
  • TryPeek(out T result):尝试返回一个对象,但不从ConcurrentBag<T>中移除它。
  • IsEmpty:获取一个值,该值指示ConcurrentBag<T>是否为空。
  • Count:获取ConcurrentBag<T>中包含的元素数量。

示例:使用ConcurrentBag

示例1:基本用法

C#
static void Main(string[] args) { ConcurrentBag<int> bag = new ConcurrentBag<int>(); // 使用多个线程向ConcurrentBag添加元素 Parallel.For(0, 10, i => { bag.Add(i); }); Console.WriteLine($"包裹数量: {bag.Count}"); // 尝试从ConcurrentBag中移除元素 if (bag.TryTake(out int result)) { Console.WriteLine($"从包裹中取出{result}"); } Console.WriteLine($"包裹数量: {bag.Count}"); }

image.png

这个例子展示了如何使用ConcurrentBag<T>来添加和移除元素。我们通过Parallel.For并行地向集合中添加元素,然后尝试从集合中移除一个元素。

示例2:使用ConcurrentBag存储任务的结果

C#
using System; using System.Collections.Concurrent; using System.Linq; using System.Threading.Tasks; class Program { static void Main(string[] args) { ConcurrentBag<double> results = new ConcurrentBag<double>(); // 执行并行任务,并将结果存储在ConcurrentBag中 Parallel.For(0, 10, i => { // 模拟一些计算 double result = Math.Sqrt(i); results.Add(result); }); // 输出结果 Console.WriteLine("Results:"); foreach (var result in results) { Console.WriteLine(result); } } }

image.png

这个例子中,我们并行执行了一系列任务,每个任务计算一个数的平方根,并将结果存储在ConcurrentBag<double>中。由于ConcurrentBag<T>是线程安全的,我们可以放心地在多个线程中向它添加元素。

总结

ConcurrentBag<T>是C#中一个非常有用的线程安全集合类型,它提供了一种高效的方式来管理并发环境下的数据。通过上述示例,我们可以看到ConcurrentBag<T>在并发编程中的应用。掌握ConcurrentBag<T>的使用,对于开发高效、可靠的多线程应用程序至关重要。

本文作者:技术老小子

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!