【问题标题】:LINQ Order by - Parallel.Foreach [duplicate]LINQ 排序方式 - Parallel.Foreach [重复]
【发布时间】:2019-06-17 13:14:17
【问题描述】:

LINQ“order by”和Parallel.Foreach有一个非常奇怪的问题

具体来说,这段代码有效:

IList<IEntitaAssociabile> result = new List<IEntitaAssociabile>();

foreach(PraticheAperteNonAssegnate pratica in praticheAperteNonAssegnate)
{
    result.Add(new EntitaAssociabile
    {
          Id = pratica.ID_Prat,
          TipologiaEntita = TipologiaEntita.Pratica,
          DataApertura = pratica.DataAper.Value,
          TipologiaPratica = pratica.Cod_TpPrat,
          NomeCliente = pratica.Nominativo,
          NumeroPraticheDaAssociare = null,
          TipologiaEntitaPadre = GetEntitaPadre(pratica, praticheLotti, praticheSottolotti),
          IdEntitaPadre = GetIdEntitaPadre(pratica, praticheLotti, praticheSottolotti)
    });
}

return result.OrderBy(x => x.Id).ToList();

如果我只是将foreach 语句更改为Parallel.Foreach

 IList<IEntitaAssociabile> result = new List<IEntitaAssociabile>();

 Parallel.ForEach(praticheAperteNonAssegnate, (pratica) =>
 {
      result.Add(new EntitaAssociabile
      {
           Id = pratica.ID_Prat,
           TipologiaEntita = TipologiaEntita.Pratica,
           DataApertura = pratica.DataAper.Value,
           TipologiaPratica = pratica.Cod_TpPrat,
           NomeCliente = pratica.Nominativo,
           NumeroPraticheDaAssociare = null,
           TipologiaEntitaPadre = GetEntitaPadre(pratica, praticheLotti, praticheSottolotti),
           IdEntitaPadre = GetIdEntitaPadre(pratica, praticheLotti, praticheSottolotti)
      });
  });

  return result.OrderBy(x => x.Id).ToList();

在“order by”我有一个“Null object reference exception”

我不明白为什么 foreach 代码可以工作,而 Parallel.Foreach 不能工作。

你能帮我解释一下是什么问题吗?

【问题讨论】:

  • 请用英文写代码。
  • 好吧,看看StackTrace,一旦你知道实际引发 NRE 的那一行,请尝试修复它。
  • 我想说这个用例的并行 foreach 没有用。
  • 用锁试试(储物柜)

标签: c# linq parallel.foreach


【解决方案1】:

好吧,List&lt;T&gt; 不是线程安全的,这就是为什么在Parallel.ForEach 中添加result 会导致问题。如果您坚持并行执行,请尝试 PLinq (Parallel Linq) 代替:

IList<IEntitaAssociabile> result = praticheAperteNonAssegnate
  .AsParallel()
  .Select(pratica => new EntitaAssociabile() {
     Id = pratica.ID_Prat,
     ...
   })
  .OrderBy(item => item.Id)
  .ToList();

如果您想切换到好的旧 Linq,请注释掉 .AsParallel()

【讨论】:

    猜你喜欢
    • 2017-11-11
    • 2010-11-22
    • 1970-01-01
    • 1970-01-01
    • 2011-01-20
    • 1970-01-01
    • 1970-01-01
    • 2014-11-28
    • 1970-01-01
    相关资源
    最近更新 更多