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
方法通知消費者線程不再有新的數據添加。這樣,消費者線程在遍歷集合時就不會一直等待新數據。