AsParallel().ForAll 可靠吗

Is AsParallel().ForAll reliable

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

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

编辑: 示例代码

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

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

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

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

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

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

示例:

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

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