LINQ 排序依据 - Parallel.Foreach
LINQ Order by - 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();
如果我只是将 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
。
你能帮我解释一下问题是什么吗?
嗯,List<T>
不是线程安全的,这就是为什么在 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()
。
我对 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
。
你能帮我解释一下问题是什么吗?
嗯,List<T>
不是线程安全的,这就是为什么在 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()
。