Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何处理BlockingCollection中的剩余数据<&燃气轮机;调用CompleteAdding()时_C#_Multithreading_.net Core_Concurrency_Producer Consumer - Fatal编程技术网

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
}