C# 添加到集合完成后,从BlockingCollection.TakeFromAny退出

C# 添加到集合完成后,从BlockingCollection.TakeFromAny退出,c#,parallel-processing,task-parallel-library,blockingcollection,C#,Parallel Processing,Task Parallel Library,Blockingcollection,我使用BlockingCollection.take fromany在循环中等待两个BlockingCollection中的可用项。项目将添加到其他字段中的集合中。在某个时刻,我完成了对集合的添加,在下一次调用TakeFromAny时,我的代码被卡住了,没有从中返回 我尝试对这两个集合使用completedadding,或使用CancellationToken参数使用TakeFromAny,但在这两种情况下都会发生异常: 使用completedadding时,消息出现ArgumentExcep

我使用
BlockingCollection.take fromany
在循环中等待两个
BlockingCollection
中的可用项。项目将添加到其他字段中的集合中。在某个时刻,我完成了对集合的添加,在下一次调用
TakeFromAny
时,我的代码被卡住了,没有从中返回

我尝试对这两个集合使用
completedadding
,或使用
CancellationToken
参数使用
TakeFromAny
,但在这两种情况下都会发生异常:

  • 使用
    completedadding
    时,消息出现
    ArgumentException
所有集合都标记为与添加相关的完整集合。参数名称:集合

  • 使用
    CancellationToken
    时,显然存在
    OperationCanceledException
是否可以以某种方式设置集合,使我的代码从TakeFromAny中毫无例外地输出,并且返回值指示基础集合中不会有任何新项

TryTakeFromAny
不适合我的需要,因为当集合当前为空但稍后仍将添加项目时,它总是返回。我想阻止,直到下一个项目可用或没有任何可添加的内容

TryTakeFromAny
不适合我的需要,因为当集合当前为空但稍后仍将添加项目时,它总是返回。我想阻止,直到下一个项目可用或没有任何可添加的内容

TryTakeFromAny()
方法具有允许您指定超时值的重载。在返回值或超过超时时间之前,该方法不会返回

对于这些重载,如果指定-1毫秒的超时,则该方法将无限期等待。如果其中一个集合调用了其
CompleteAdding()
方法,则它不会引发异常;如果传递给它的所有集合都调用了其
CompleteAdding()
方法,则它将返回
-1
作为集合索引值

一个简单的例子显示了这一点:

static void Main(字符串[]args)
{
BlockingCollection c1=新建BlockingCollection(),c2=新建BlockingCollection();
任务=生产(c1,c2);
while(BlockingCollection.TryTakeFromAny(new[]{c1,c2},out int value,-1)>=0)
{
WriteLine($“value:{value}”);
}
WriteLine($“task.IsCompleted:{task.IsCompleted}”);
task.Wait();
}
专用静态异步任务生成(BlockingCollection c1、BlockingCollection c2)
{
等待任务延迟(时间跨度从秒(1));
c1.加入(1);
等待任务延迟(时间跨度从秒(1));
c1.完成添加();
等待任务延迟(时间跨度从秒(1));
c2.增加(2);
等待任务延迟(时间跨度从秒(1));
c2.完成添加();
}