【问题标题】:Parallel Foreach with large list throws exception具有大列表的并行 Foreach 引发异常
【发布时间】:2015-12-16 23:28:20
【问题描述】:

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

System.Threading.Tasks.Task.ThrowIfExceptional(布尔 includeTaskCanceledExceptions) 在
System.Threading.Tasks.Task.Wait(Int32 毫秒超时, CancellationToken cancelToken) 在
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); }
);

【问题讨论】:

  • 你确定这是抛出异常的地方吗?您可以单击“Copy Exception Details to clipboard”并将全文发布为对您问题的编辑吗?这也将让我们看到任何内部异常或与之相关的消息。

标签: c# multithreading foreach parallel-processing


【解决方案1】:

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

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

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

【讨论】:

  • 请阅读下面的评论,太长了,我可以在这里插入
猜你喜欢
  • 1970-01-01
  • 2014-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-11
  • 1970-01-01
相关资源
最近更新 更多