带有 BlockingCollection.GetConsumableEnumerable 的 Parallel.ForEach 循环

Posted

技术标签:

【中文标题】带有 BlockingCollection.GetConsumableEnumerable 的 Parallel.ForEach 循环【英文标题】:Parallel.ForEach loop with BlockingCollection.GetConsumableEnumerable 【发布时间】:2011-09-30 06:50: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();

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

真正让我困惑的是为什么当我调用 _collection.CompleteAdding() 时 Parallel.ForEach 会抛出异常。 @Sam:老实说,我不想说。那里有太多深奥的魔法,我没有信心说出正确的话:) Parallel Extensions Extras 的当前 URL:code.msdn.microsoft.com/ParExtSamples 并且有人对扩展进行了 NuGet:nuget.org/packages/MSFT.ParallelExtensionsExtras Can Bilgin 最近关于这种组合的文章 - link 博客链接:ParallelExtensionsExtras Tour – #4 – BlockingCollectionExtensions

以上是关于带有 BlockingCollection.GetConsumableEnumerable 的 Parallel.ForEach 循环的主要内容,如果未能解决你的问题,请参考以下文章

带有和不带有聚合的 sql 查询

如何翻转正面带有标签而背面带有另一个标签的视图 - 参见图片

CakePHP 如何处理带有/不带有 'id' 字段的 HABTM 表?

带有滚动的 Div 和带有绝对位置的内容

带有 RecyclerView 的 DialogFragment 比带有 Recyclerview 的 Fragment 慢

访问控制允许带有和不带有 www 的来源