与BlockingCollection.GetConsumableEnumerable的Parallel.ForEach循环

时间:2011-07-07 08:50:58

标签: c#-4.0 parallel-processing task-parallel-library

为什么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 个答案:

答案 0 :(得分:21)

正如我最近发现的那样,将Parallel.ForEachBlockingCollection一起使用有些问题。它可以工作,但需要一点额外的努力。

Stephen Toub有一个excellent blog post on it,如果你下载"Parallel Extension Extras"项目(also available on NuGet),你会发现一些代码可以帮助你。