我对AsParallel()进行了查询,在我的例子中,.ForAll有时跳过一些记录,有时返回空记录。
我不知道这就是原因。.Net中的并行机制可靠吗?
编辑:示例代码
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);
});发布于 2015-04-07 12:00:55
与其在并行循环中向集合添加内容,不如让框架处理构建集合。
示例:
var processedCollection = collection
.Where(h => h.Id == id)
.AsParallel()
.Select(h => ProcessItem(h))
.ToArray();在ProcessItem中,将进行处理。平行地这样做似乎没有必要。
发布于 2015-04-07 11:39:25
我想processedCollection是一个不是线程安全的集合(可能是一个简单的泛型列表?)。
一个简单的解决方案是使用锁:
lock (processedCollection) // or better use a dedicated lock object
{
processedCollection.Add(processedCollectionItem);
}或者使用线程安全集合(如ConcurrentBag<> )。
https://stackoverflow.com/questions/29470303
复制相似问题