【问题标题】:Parallel.ForEach loop with BlockingCollection.GetConsumableEnumerable带有 BlockingCollection.GetConsumableEnumerable 的 Parallel.ForEach 循环
【发布时间】: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();
}

【问题讨论】:

    标签: c# parallel-processing task-parallel-library parallel.foreach blockingcollection


    【解决方案1】:

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

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-19
    • 1970-01-01
    • 2012-01-03
    • 2021-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多