我有一个大型列表(1000或更多),我使用Parallel.Foreach
来循环它,但我得到了这个例外:
System.Threading.Tasks.Task.ThrowIfExceptional(布尔 includeTaskCanceledExceptions) System.Threading.Tasks.Task.Wait(Int32 millisecondsTimeout, 取消语音取消语言)在 System.Threading.Tasks.Task.Wait()
请让我知道为什么我会遇到此异常并给我一个解决方案,以及如何提高并行foreach
的性能?
var results = new List<BO>();
var localLockObject = new object();
Parallel.ForEach(
emails,
() => new List<BO>(), (email, state, localList) =>
{
var item = new BO();
localList.Add(item.Validate(email));
return localList;
},
finalResult => { lock (localLockObject) results.AddRange(finalResult); }
);
答案 0 :(得分:3)
您的Parallel.ForEach
声明似乎没问题,我不确定这是否会产生异常。
然而,这个用例的更好的解决方案是使用 PLINQ,不需要同步:
var result = emails.AsParallel()
.Select(email =>
{
var item = new BO();
return item.Validate(email);
}).ToList();