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
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.完成添加();
}