【问题标题】:Is AsParallel().ForAll reliableAsParallel().ForAll 是否可靠
【发布时间】:2015-04-06 11:24:23
【问题描述】:

我使用 AsParallel() 进行查询。在我的情况下,ForAll 有时会跳过一些记录,有时会返回空记录。

我不确定这是不是这个的确切原因。 .Net中的parallal for in 的机制可靠吗?

编辑: 示例代码

var collection=.. Collection from database
var processedCollection=...
collection.Where(h => h.Id == id).AsParallel().ForAll(h =>
{
    var processedCollectionItem = ....logic to process the item
    processedCollectionItem.Where(c=>c.....).AsParallel().ForAll(c =>
    {
        //logic to process the records
    });
    processedCollection.Add(processedCollectionItem);
});

【问题讨论】:

  • 我强烈怀疑是您的 usage 有问题,而不是 BCL。你能发布一个简短但完整的程序来演示这个问题吗?

标签: c# c#-4.0 parallel.foreach reliability


【解决方案1】:

与其在并行循环中向集合中添加内容,不如让框架来处理构建集合。

例子:

var processedCollection = collection
    .Where(h => h.Id == id)
    .AsParallel()
    .Select(h => ProcessItem(h))
    .ToArray();

在 ProcessItem 中会进行处理。并行执行似乎没有必要。

【讨论】:

    【解决方案2】:

    我猜processedCollection 是一个非线程安全的集合(可能是一个简单的通用列表?)。

    一个简单的解决方案是使用锁:

    lock (processedCollection) // or better use a dedicated lock object
    {
        processedCollection.Add(processedCollectionItem);
    }
    

    或使用像ConcurrentBag<> 这样的线程安全集合。

    【讨论】:

    • 是的,processedCollection 是简单的通用列表。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-15
    • 1970-01-01
    • 2019-08-26
    • 1970-01-01
    • 2011-03-29
    相关资源
    最近更新 更多