为什么使用 GetConsumableEnumerable
时,Parallel.ForEach
循环会退出并出现 OperationCancelledException
异常?
//outside the function
static BlockingCollection<double> _collection = new BlockingCollection<double>();
var t = Task.Factory.StartNew(Producer);
Parallel.ForEach(_collection.GetConsumingEnumerable(),
item => Console.WriteLine("Processed {0}", item));
Console.WriteLine("FINISHED processing");
public static void Producer()
{
var data = Enumerable.Range(1, 1000);
foreach (var i in data)
{
_collection.Add(i);
Console.WriteLine("Added {0}",i);
}
Console.WriteLine("Finished adding");
_collection.CompleteAdding();
}
OperationCancelledException
行为。问题中的代码运行成功完成,没有抛出任何异常。 - Theodor ZouliasBlockingCollection<T>
作为并行操作的源时,建议使用配置了EnumerablePartitionerOptions.NoBuffering
选项的Partitioner
,如此处所示。否则,消费者可能会尝试咬下更多,导致延迟增加,并有可能死锁。 - Theodor Zoulias