我对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();
在“排序依据”上,我有一个“空对象引用异常”
我无法理解为什么使用foreach
的代码有效,但是不能使用Parallel.Foreach
的代码。
您能帮我解释一下问题吗?
答案 0 :(得分:7)
好吧,List<T>
是不是线程安全的,这就是为什么在result
中添加到Parallel.ForEach
会导致问题。如果您坚持并行执行,请尝试使用 PLinq ( Parallel Linq):
IList<IEntitaAssociabile> result = praticheAperteNonAssegnate
.AsParallel()
.Select(pratica => new EntitaAssociabile() {
Id = pratica.ID_Prat,
...
})
.OrderBy(item => item.Id)
.ToList();
如果要切换到旧的Linq,请注释.AsParallel()
。