Sam*_*Sam 22 parallel-processing task-parallel-library c#-4.0
为什么parallel.ForEach循环使用OperationCancelledException退出,同时使用GetConsumableEnumerable?
//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();
}
Run Code Online (Sandbox Code Playgroud)
Jon*_*eet 21
正如我最近发现的,使用Parallel.ForEach
with BlockingCollection
有点问题.它可以工作,但它需要一点额外的努力.
Stephen Toub有一篇很棒的博客文章,如果你下载"Parallel Extension Extras"项目(也可以在NuGet上找到),你会发现一些代码可以帮助你.