C# 从 BlockingCollection 取数据
时间: 2024-11-09 13:22:13 浏览: 6
在C#中,`BlockingCollection<T>`是一个方便的数据结构,用于线程间通信,尤其是当一个线程需要从另一个线程填充的队列中取出数据时。它提供了一些同步方法,使得主线程能够安全地阻塞直到有新的数据可用。以下是基本的步骤来从`BlockingCollection`取数据:
1. 首先,创建一个新的`BlockingCollection`实例,并确保它的容量足够容纳预期的数据量。例如:
```csharp
BlockingCollection<MyObject> collection = new BlockingCollection<MyObject>(boundedCapacity);
```
2. 然后,主线程可以使用`Take()`方法来阻塞并获取一个元素,直到子线程添加了数据。如果`Take()`方法返回null,说明集合为空并且已经达到最大容量:
```csharp
MyObject newData; // 或者用 await 关键字包装,如 await collection.TakeAsync();
while (newData == null) // 或者用 TryTake,避免无限阻塞
{
newData = collection.Take();
}
```
3. 当子线程准备好新数据时,通常会通过`Add()`或`Enqueue()`方法将其添加到`BlockingCollection`:
```csharp
MyObject itemToPush = ...;
collection.Add(itemToPush); // 或者 Enqueue(itemToPush);
```
注意,`Take()`和`Add()`都是非阻塞的,所以在多线程环境下,你需要确保适当的同步来防止数据竞争。
阅读全文