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 中将进行处理。并行执行此操作似乎没有必要。
我使用 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 中将进行处理。并行执行此操作似乎没有必要。