Подтвердить что ты не робот

Параллельный цикл 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();
}
4b9b3361

Ответ 1

Использование Parallel.ForEach с BlockingCollection несколько проблематично, как я узнал недавно. Его можно заставить работать, но ему нужно немного дополнительных усилий.

У Стивена Туба есть отличная запись в блоге, и если вы загрузите "Parallel Extension Extras" (также доступен в NuGet), вы найдете код, готовый помочь вам.