我有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);
});
答案 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中,将进行处理。并行执行此操作似乎没有必要。