C# 如何处理BlockingCollection中的剩余数据<&燃气轮机;调用CompleteAdding()时
C# 如何处理BlockingCollection中的剩余数据<&燃气轮机;调用CompleteAdding()时,c#,multithreading,.net-core,concurrency,producer-consumer,C#,Multithreading,.net Core,Concurrency,Producer Consumer,BlockingCollection在接收到来自completedadding()方法的调用时忽略处理基础队列中的剩余数据。以下代码是消费者方法的一部分: while (blockingCollection.TryTake(out item Item)) { //Do something with item. } 相反,我想改变它,使它在生产者发布CompleteAdding()方法后处理所有剩余的项目,然后才从循环中跳出。这是而不是消费a的正确方法: 上述循环随时退出,blockin
BlockingCollection
在接收到来自completedadding()
方法的调用时忽略处理基础队列中的剩余数据。以下代码是消费者方法的一部分:
while (blockingCollection.TryTake(out item Item))
{
//Do something with item.
}
相反,我想改变它,使它在生产者发布
CompleteAdding()
方法后处理所有剩余的项目,然后才从循环中跳出。这是而不是消费a的正确方法:
上述循环随时退出,blockingCollection
暂时没有项目。正确的方法是列举:
当blockingCollection
被标记为completedadding
且所有可用项都已处理时,上述循环将退出。如果在任何时刻blockingCollection
暂时为空,则循环将阻塞当前线程,同步等待新项目或completedadding()
信号
下面介绍了一种更专门的循环变体。在不活动的情况下,它每隔几秒钟记录一条消息,以便您知道消费者不是死的,而是空闲的
while (true)
{
while (blockingCollection.TryTake(out item Item, TimeSpan.FromSeconds(10)))
{
// Do something with item
}
if (blockingCollection.IsCompleted) break;
// Log a heartbeat
}
foreach (var item in blockingCollection.GetConsumingEnumerable())
{
// Do something with item
}
while (true)
{
while (blockingCollection.TryTake(out item Item, TimeSpan.FromSeconds(10)))
{
// Do something with item
}
if (blockingCollection.IsCompleted) break;
// Log a heartbeat
}