C# BlockingCollection如何判断消费完毕
时间: 2024-10-03 14:00:57 浏览: 39
C#多线程学习之(三)生产者和消费者用法分析
`BlockingCollection<T>`是.NET框架中的一个并发集合,它允许生产者线程向集合添加元素,而消费者线程则从集合中取出元素。如果你想要判断所有的任务是否已经被消费完毕,你可以通过以下几种方式:
1. 使用TakeAll()或ToArray()方法:当所有元素都被取走时,这些方法会抛出`InvalidOperationException`异常。你可以捕获这个异常来检查是否消费完毕。
```csharp
var collection = new BlockingCollection<int>();
// ... 添加元素到collection
try
{
var elementsConsumed = collection.TakeAll(); // 或者 elementsConsumed = collection.ToArray();
}
catch (InvalidOperationException)
{
Console.WriteLine("所有元素已消费完毕");
}
```
2. 使用Count属性:在消费者循环中,每次取完元素后检查集合的剩余元素数。如果`Count`为0,说明消费完毕。
```csharp
while (!collection.IsEmpty)
{
int element;
if (collection.TryTake(out element))
{
// 消费元素...
}
else
{
break; // 所有元素已经消费完毕
}
}
if (collection.Count == 0)
{
Console.WriteLine("消费完毕");
}
```
3. 使用Consume方法和监视器:`Consume`方法可以阻塞直到有可用元素或达到给定的最大尝试次数。结合使用`Monitor`类可以检测队列是否为空。
```csharp
Monitor.Enter(collection);
while (true)
{
if (collection.Count == 0 && !collection.IsAddingCompleted)
{
Monitor.Wait(collection); // 等待队列非空或添加完成
}
if (collection.TryTake(out int element)) // 如果有元素可用,消费并退出循环
{
// 消费元素...
break;
}
}
Monitor.Exit(collection);
if (collection.Count == 0)
{
Console.WriteLine("消费完毕");
}
```
阅读全文