2011-07-07 61 views
17

爲什麼在使用GetConsumableEnumerable時,parallel.ForEach循環會退出OperationCancelledException?Parallel.ForEach循環與BlockingCollection.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(); 
} 

回答

17

使用Parallel.ForEachBlockingCollection是有點問題,因爲我最近發現。它可以工作,但它需要一點額外的努力。

Stephen Toub有一個excellent blog post on it,如果你下載了"Parallel Extension Extras"項目(also available on NuGet),你會發現一些代碼準備好幫助你。

+0

真正令我困惑的是,爲什麼當我調用_collection.CompleteAdding()時,Parallel.ForEach拋出異常。 – Sam

+0

@Sam:說實話,我不想說。有太多的深刻的魔力在那裏爲我有信心說正確的事情:) –

+0

並行擴展附加的當前URL: https://code.msdn.microsoft.com/ParExtSamples 和有人已經作出一個擴展的NuGet: https://www.nuget.org/packages/MSFT.ParallelExtensionsExtras/ – Reyhn

相關問題