对于LINQ "order“和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();如果我简单地用Parallel.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“,我有一个"Null对象引用异常”
我不明白为什么使用foreach的代码工作,但不适用于Parallel.Foreach。
你能帮我解释一下有什么问题吗?
发布于 2019-06-17 13:18:19
List<T>并不是线程安全的,这就是为什么在Parallel.ForEach中添加到result会导致问题的原因。如果坚持并行执行,请尝试PLinq (并行Linq):
IList<IEntitaAssociabile> result = praticheAperteNonAssegnate
.AsParallel()
.Select(pratica => new EntitaAssociabile() {
Id = pratica.ID_Prat,
...
})
.OrderBy(item => item.Id)
.ToList();如果您想要切换到好的旧Linq,请注释掉.AsParallel()。
https://stackoverflow.com/questions/56632132
复制相似问题