22

为什么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();
}
4

1 回答 1

24

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

Stephen Toub 有一篇很棒的博客文章,如果您下载“Parallel Extension Extras”项目(也可在 NuGet 上获得),您会发现一些代码可以帮助您。

于 2011-07-07T08:54:33.770 回答