具有大型列表的并行Foreach抛出异常

时间:2015-12-15 16:30:58

标签: c# multithreading foreach parallel-processing

我有一个大型列表(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); }
);

1 个答案:

答案 0 :(得分:3)

您的Parallel.ForEach声明似乎没问题,我不确定这是否会产生异常。

然而,这个用例的更好的解决方案是使用 PLINQ,不需要同步:

var result = emails.AsParallel()
                   .Select(email => 
                    { 
                       var item = new BO();
                       return item.Validate(email);
                    }).ToList();