温馨提示×

c# blockingcollection如何实现线程安全

c#
小樊
121
2024-11-21 05:36:10
栏目: 编程语言

BlockingCollection 是 .NET 集合框架中提供的一个线程安全的集合类,它可以用于在多线程环境下存储和传递数据。它提供了 AddTakeTryTake 等方法,这些方法都是线程安全的。下面是一个简单的示例,展示了如何使用 BlockingCollection 实现线程安全的数据传递:

using System; using System.Collections.Concurrent; using System.Threading; class Program { static BlockingCollection<int> _blockingCollection = new BlockingCollection<int>(); static void Producer() { for (int i = 0; i < 10; i++) { _blockingCollection.Add(i); Console.WriteLine($"Produced: {i}"); Thread.Sleep(1000); // 模拟生产数据所需的时间 } // 生产完成后,通知消费者 _blockingCollection.CompleteAdding(); } static void Consumer() { foreach (var item in _blockingCollection.GetConsumingEnumerable()) { Console.WriteLine($"Consumed: {item}"); Thread.Sleep(2000); // 模拟消费数据所需的时间 } } static void Main(string[] args) { Thread producerThread = new Thread(Producer); Thread consumerThread = new Thread(Consumer); producerThread.Start(); consumerThread.Start(); producerThread.Join(); consumerThread.Join(); } } 

在这个示例中,我们创建了一个 BlockingCollection<int> 实例,并启动了两个线程:一个生产者线程和一个消费者线程。生产者线程将数据添加到集合中,而消费者线程从集合中获取数据。BlockingCollectionAddGetConsumingEnumerable 方法都是线程安全的,因此我们不需要额外的同步措施。

注意,当生产者线程完成数据添加后,需要调用 CompleteAdding 方法通知消费者线程不再有新的数据添加。这样,消费者线程在遍历集合时就不会一直等待新数据。

0