c# - 具有大列表的并行 Foreach 抛出异常

标签 c# multithreading foreach parallel-processing

我有一个大列表(1000 或更多),我正在使用 Parallel.Foreach 来循环它,但我得到了这个异常:

System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions) at
System.Threading.Tasks.Task.Wait(Int32 millisecondsTimeout, CancellationToken cancellationToken) at
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); }
);

最佳答案

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

但是,针对此用例的更好解决方案是使用 PLINQ不需要同步:

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

关于c# - 具有大列表的并行 Foreach 抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34294487/

相关文章:

c# - MVC 6、.Net461 上的 SignalR

java - JavaFX 中的 Platform.runLater 和 Task

c# - 不允许来电 Lync Api 或禁用来电声音

c# - Http GetJsonAsync 从服务器 API 返回 null

C++ - 通过多线程同时播放多个蜂鸣声?

c++ - C++ 中的线程 vector

ajax - Foreach 循环遍历 cpt 类别以使用 ACF 值

php - 如何在 PHP 中使用 foreach 循环设置多个复选框中的选定属性?

JavaScript,Node.js : is Array. forEach 异步?

c# - 从匿名类型中获取值(value)?