BlockingCollection
是 .NET 集合框架中提供的一个线程安全的集合类,它可以用于在多线程环境下存储和传递数据。它提供了 Add
、Take
和 TryTake
等方法,这些方法都是线程安全的。下面是一个简单的示例,展示了如何使用 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>
实例,并启动了两个线程:一个生产者线程和一个消费者线程。生产者线程将数据添加到集合中,而消费者线程从集合中获取数据。BlockingCollection
的 Add
和 GetConsumingEnumerable
方法都是线程安全的,因此我们不需要额外的同步措施。
注意,当生产者线程完成数据添加后,需要调用 CompleteAdding
方法通知消费者线程不再有新的数据添加。这样,消费者线程在遍历集合时就不会一直等待新数据。