LINQ订购依据-Parallel.Foreach

Ala*_*rdò 0 c# linq parallel.foreach

我对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();
Run Code Online (Sandbox Code Playgroud)

如果我只是用以下命令更改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();
Run Code Online (Sandbox Code Playgroud)

在“排序依据”上,我有一个“空对象引用异常”

我不明白为什么使用foreach代码有效,但不能使用Parallel.Foreach

您能帮我解释一下问题吗?

Dmi*_*nko 7

那么,List<T>不是线程安全的,这就是为什么增加了resultParallel.ForEach导致的问题。如果您坚持并行执行,请尝试使用PLinqParallel Linq):

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

.AsParallel()如果要切换到旧版Linq,请注释掉。