是AsParallel()。ForAll可靠

时间:2015-04-06 11:24:24

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

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

我不确定这是否是确切的原因。 在.Net中parellal的机制是否可靠?

编辑: 示例代码

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);
});

2 个答案:

答案 0 :(得分:1)

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

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

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

或使用类似ConcurrentBag<>的线程安全集合。

答案 1 :(得分:1)

不是在并行循环中向集合添加东西,而是让框架处理构建集合可能会更好。

示例:

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

在ProcessItem中,将进行处理。并行执行此操作似乎没有必要。