Parallel.ForEach loop with BlockingCollection.GetConsumableEnumerable
Why Parallel.ForEach
loop exits with OperationCancelledException
, while using 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 Pr开发者_如何学JAVAoducer()
{
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();
}
Using Parallel.ForEach
with BlockingCollection
is somewhat problematic, as I found out recently. It can be made to work, but it needs a little extra effort.
Stephen Toub has an excellent blog post on it, and if you download the "Parallel Extension Extras" project (also available on NuGet) you'll find some code ready to help you.
精彩评论