使用Microsoft Docs中的第二个示例,当我有一个非阻塞消费者时,当 a 中没有项目时让消费者等待的首选方法是什么BlockingCollection
?文档中的示例如下。
static void NonBlockingConsumer(BlockingCollection<int> bc, CancellationToken ct)
{
// IsCompleted == (IsAddingCompleted && Count == 0)
while (!bc.IsCompleted)
{
int nextItem = 0;
try
{
if (!bc.TryTake(out nextItem, 0, ct))
{
Console.WriteLine(" Take Blocked");
}
else
Console.WriteLine(" Take:{0}", nextItem);
}
catch (OperationCanceledException)
{
Console.WriteLine("Taking canceled.");
break;
}
// Slow down consumer just a little to cause
// collection to fill up faster, and lead to "AddBlocked"
Thread.SpinWait(500000);
}
Console.WriteLine("\r\nNo more items to take.");
}
上面的示例用于SpinWait
暂停消费者。
简单地使用以下命令可能会使 CPU 非常忙碌。
if (!bc.TryTake(out var item))
{
continue;
}
这里让消费者等待的首选方法是什么?我计划使用几个BlockingCollection
s 并寻找使用它的最佳方式。