22

を使用しているときにParallel.ForEachループが終了するのはなぜですか?OperationCancelledExceptionGetConsumableEnumerable

//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

最近わかったように、 with の使用Parallel.ForEachには多少問題があります。BlockingCollection動作させることはできますが、少し余分な努力が必要です。

Stephen Toub はそれに関する優れたブログ投稿を行っています。 「Parallel Extension Extras」プロジェクト ( NuGet でも入手可能)をダウンロードすると、すぐに役立つコードがいくつか見つかります。

于 2011-07-07T08:54:33.770 に答える