Параллельный цикл forEach с BlockingCollection.GetConsumableEnumerable
Почему цикл 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();
}
Ответы
Ответ 1
Использование Parallel.ForEach
с BlockingCollection
несколько проблематично, как я узнал недавно. Его можно заставить работать, но ему нужно немного дополнительных усилий.
У Стивена Туба есть отличная запись в блоге, и если вы загрузите "Parallel Extension Extras" (также доступен в NuGet), вы найдете код, готовый помочь вам.