BlockingCollection
是 .NET 集合框架中的一個類,它提供了一種線程安全的集合,可以用于在生產者和消費者線程之間傳遞數據。它可以處理阻塞操作,以確保在生產者向集合中添加元素時,消費者不會在集合為空時嘗試獲取元素,反之亦然。
以下是使用 BlockingCollection
處理阻塞操作的一個簡單示例:
using System;
using System.Collections.Concurrent;
using System.Threading;
class Program
{
static BlockingCollection<int> _blockingCollection = new BlockingCollection<int>();
static void Main(string[] args)
{
// 創建一個生產者線程
Thread producerThread = new Thread(() =>
{
for (int i = 0; i < 10; i++)
{
Console.WriteLine($"生產者生產了: {i}");
_blockingCollection.Add(i);
Thread.Sleep(1000); // 模擬生產過程耗時
}
_blockingCollection.CompleteAdding(); // 通知消費者不再有新的元素添加
});
// 創建一個消費者線程
Thread consumerThread = new Thread(() =>
{
while (!_blockingCollection.IsCompleted) // 當集合未完成時,繼續循環
{
int item = _blockingCollection.Take(); // 從集合中獲取元素,如果集合為空,則阻塞線程
Console.WriteLine($"消費者消費了: {item}");
Thread.Sleep(2000); // 模擬消費過程耗時
}
});
// 啟動生產者和消費者線程
producerThread.Start();
consumerThread.Start();
// 等待線程執行完成
producerThread.Join();
consumerThread.Join();
Console.WriteLine("所有操作已完成");
}
}
在這個示例中,我們創建了一個 BlockingCollection<int>
實例,用于在生產者和消費者線程之間傳遞整數。生產者線程向集合中添加元素,消費者線程從集合中獲取元素。當集合為空時,消費者線程會被阻塞,直到生產者線程向集合中添加新元素。同樣,當集合中的所有元素都被消費完畢時,生產者線程會被阻塞,直到消費者線程從集合中獲取元素。
BlockingCollection
還提供了其他方法,如 TryAdd()
和 TryTake()
,它們在無法添加或獲取元素時會立即返回,而不是阻塞線程。這可以在某些情況下提供更好的性能。