I'm making some improvements in a method, which now takes an average of 19 to 22 seconds to bring the information to VIEW and I saw the possibility of replacing the foreach with Parallel.Foreach.
I changed and rolled the code locally and it worked, including dropped to 5.68s the return to view, but when I run the test server it gives the following error:
(Thatdoesnothappenlocally.)
Followthecodewithforeachandwithout.
Codeusingforeach
foreach(DataRowdrinmyDs.Tables[0].Rows){PedidoFollowupmyPedido=newPedidoFollowup(){Id=int.Parse(dr["iPedidoCompra"].ToString()),
DataImplantacao = Convert.ToDateTime(dr["dDataPedido"].ToString()),
Ordem = new Ordem()
{
Id = int.Parse(dr["iNumeroOrdem"].ToString()),
DataEntrega = Convert.ToDateTime(dr["dPrevisaoEntrega"].ToString()),
UnidadeDestino = new SEW.Model.UnidadeDestino() { Id = int.Parse(dr["cDestino"].ToString()) },
Pim = new Pim.Model.Pim() { Id = int.Parse(dr["iPim"].ToString()) },
QuantidadeSolicitada = Convert.ToDecimal(dr["dQtde"].ToString()),
Narrativa = dr["cNarrativaOc"].ToString(),
PrecoTotal = Convert.ToDecimal(dr["dPrecoTotal"].ToString()),
PrecoUnitario = Convert.ToDecimal(dr["dPrecoUnitario"].ToString()),
Saldo = Convert.ToDecimal(dr["dSaldo"].ToString()),
Requisitante = new Requisitante() { Id = dr["cRequisitante"].ToString() },
Item = new Item()
{
Id = dr["cItem"].ToString(),
Descricao = dr["cItemDescricao"].ToString()
},
Natureza = int.Parse(dr["iNaturezaOrdem"].ToString()),
VisualizadoFornecedor = (Boolean)dr["lVisualizadoForn"],
DataVisualizadoForn = dr["cDataVisualizacaoForn"].ToString() == "" ? (DateTime?)null : Convert.ToDateTime(dr["cDataVisualizacaoForn"].ToString())
},
Fornecedor = new Fornecedor()
{
Id = int.Parse(dr["iCodEmitente"].ToString()),
NomeAbrev = dr["cNomeAbreEmitente"].ToString(),
Cidade = dr["cCidade"].ToString()
},
Comentario = dr["cComentario"].ToString(),
Prioridade = int.Parse(dr["iPrioridade"].ToString()),
NotasFiscais = new intranetRepository.MFT.Repository.NotaFiscalRepository().ListarNotasFiscaisPorOrdemCompra(new Ordem() { Id = int.Parse(dr["iNumeroOrdem"].ToString()) }),
DivergenciaValor = false,
DivergenciaQuantidade = false,
QuantidadeFaturada = 0,
TotalFaturado = 0,
Situacao = dr["cSituacao"].ToString() != "" ? Convert.ToString(dr["cSituacao"].ToString()) : " ",
OcorrenciaSemVisualizacao = Convert.ToBoolean(dr["lOcorrenciaSemVisualiz"].ToString()),
Coleta = dr["cDataColeta"].ToString() == "" ? null : new ColetaFollowup() { DataColeta = Convert.ToDateTime(dr["cDataColeta"].ToString()) },
TipoEntrega = new TipoEntrega() { Id = int.Parse(dr["iTipoEntrega"].ToString()) }
};
myQtdeTotal = 0;
myValorTotal = 0;
if (myPedido.NotasFiscais != null)
{
foreach (MFT.Model.NotaFiscal myNota in myPedido.NotasFiscais)
{
foreach (MFT.Model.ItemNotaFiscal myItem in myNota.Itens)
{
myValorTotal += myItem.ValorTotal;
myQtdeTotal += myItem.Quantidade;
}
}
myPedido.QuantidadeFaturada = myQtdeTotal;
myPedido.TotalFaturado = myValorTotal;
if (myPedido.Situacao != "A")
{
if (myPedido.Ordem.Natureza == 2)
{
myPedido.DivergenciaValor = myValorTotal != myPedido.Ordem.PrecoTotal;
}
else
{
myPedido.DivergenciaValor = (myValorTotal != myPedido.Ordem.PrecoTotal);
myPedido.DivergenciaQuantidade = myQtdeTotal != myPedido.Ordem.QuantidadeSolicitada;
}
if ((myPedido.DivergenciaValor) || (myPedido.DivergenciaQuantidade))
{
myPedido.Situacao = "DN";
}
else
{
if(myPedido.TipoEntrega.Id != 3)
{
ColetaFollowup myColeta = new ColetaFollowup()
{
Pedido = myPedido,
Usuario = pUsuario,
DataColeta = DateTime.Now,
Situacao = "P"
};
new ColetaFollowupRepository().SolicitarColeta(myColeta);
myPedido.Situacao = "A";
}
}
}
pedidos.Add(myPedido);
}
else
{
if ((myPedido.Ordem.DataEntrega.AddDays(-10) <= DateTime.Now) && (myPedido.OcorrenciaSemVisualizacao == false) && (myPedido.Coleta == null))
{
myPedido.Situacao = "P";
}
pedidos.Add(myPedido);
}
}
Code using Parallel.ForEach
Parallel.ForEach(myDs.Tables[0].Rows.Cast<DataRow>(), dr =>
{
PedidoFollowup myPedido = new PedidoFollowup()
{
Id = int.Parse(dr["iPedidoCompra"].ToString()),
DataImplantacao = Convert.ToDateTime(dr["dDataPedido"].ToString(), CultureInfo.InvariantCulture),
Ordem = new Ordem()
{
Id = int.Parse(dr["iNumeroOrdem"].ToString()),
DataEntrega = Convert.ToDateTime(dr["dPrevisaoEntrega"].ToString(), CultureInfo.InvariantCulture),
UnidadeDestino = new SEW.Model.UnidadeDestino() { Id = int.Parse(dr["cDestino"].ToString()) },
Pim = new Pim.Model.Pim() { Id = int.Parse(dr["iPim"].ToString()) },
QuantidadeSolicitada = Convert.ToDecimal(dr["dQtde"].ToString()),
Narrativa = dr["cNarrativaOc"].ToString(),
PrecoTotal = Convert.ToDecimal(dr["dPrecoTotal"].ToString()),
PrecoUnitario = Convert.ToDecimal(dr["dPrecoUnitario"].ToString()),
Saldo = Convert.ToDecimal(dr["dSaldo"].ToString()),
Requisitante = new Requisitante() { Id = dr["cRequisitante"].ToString() },
Item = new Item()
{
Id = dr["cItem"].ToString(),
Descricao = dr["cItemDescricao"].ToString()
},
Natureza = int.Parse(dr["iNaturezaOrdem"].ToString()),
VisualizadoFornecedor = (Boolean)dr["lVisualizadoForn"],
DataVisualizadoForn = dr["cDataVisualizacaoForn"].ToString() == "" ? (DateTime?)null : Convert.ToDateTime(dr["cDataVisualizacaoForn"].ToString(), CultureInfo.InvariantCulture)
},
Fornecedor = new Fornecedor()
{
Id = int.Parse(dr["iCodEmitente"].ToString()),
NomeAbrev = dr["cNomeAbreEmitente"].ToString(),
Cidade = dr["cCidade"].ToString()
},
Comentario = dr["cComentario"].ToString(),
Prioridade = int.Parse(dr["iPrioridade"].ToString()),
NotasFiscais = new intranetRepository.MFT.Repository.NotaFiscalRepository().ListarNotasFiscaisPorOrdemCompra(new Ordem() { Id = int.Parse(dr["iNumeroOrdem"].ToString()) }),
DivergenciaValor = false,
DivergenciaQuantidade = false,
QuantidadeFaturada = 0,
TotalFaturado = 0,
Situacao = dr["cSituacao"].ToString() != "" ? Convert.ToString(dr["cSituacao"].ToString()) : " ",
OcorrenciaSemVisualizacao = Convert.ToBoolean(dr["lOcorrenciaSemVisualiz"].ToString()),
Coleta = dr["cDataColeta"].ToString() == "" ? null : new ColetaFollowup() { DataColeta = Convert.ToDateTime(dr["cDataColeta"].ToString(), CultureInfo.InvariantCulture) },
TipoEntrega = new TipoEntrega() { Id = int.Parse(dr["iTipoEntrega"].ToString()) }
};
myQtdeTotal = 0;
myValorTotal = 0;
if (myPedido.NotasFiscais != null)
{
foreach (MFT.Model.NotaFiscal myNota in myPedido.NotasFiscais)
{
foreach (MFT.Model.ItemNotaFiscal myItem in myNota.Itens)
{
myValorTotal += myItem.ValorTotal;
myQtdeTotal += myItem.Quantidade;
}
}
myPedido.QuantidadeFaturada = myQtdeTotal;
myPedido.TotalFaturado = myValorTotal;
if (myPedido.Situacao != "A")
{
if (myPedido.Ordem.Natureza == 2)
{
myPedido.DivergenciaValor = myValorTotal != myPedido.Ordem.PrecoTotal;
}
else
{
myPedido.DivergenciaValor = (myValorTotal != myPedido.Ordem.PrecoTotal);
myPedido.DivergenciaQuantidade = myQtdeTotal != myPedido.Ordem.QuantidadeSolicitada;
}
if ((myPedido.DivergenciaValor) || (myPedido.DivergenciaQuantidade))
{
myPedido.Situacao = "DN";
}
else
{
if (myPedido.TipoEntrega.Id != 3)
{
ColetaFollowup myColeta = new ColetaFollowup()
{
Pedido = myPedido,
Usuario = pUsuario,
DataColeta = DateTime.Now,
Situacao = "P"
};
new ColetaFollowupRepository().SolicitarColeta(myColeta);
myPedido.Situacao = "A";
}
}
}
pedidos.Add(myPedido);
}
else
{
if ((myPedido.Ordem.DataEntrega.AddDays(-10) <= DateTime.Now) && (myPedido.OcorrenciaSemVisualizacao == false) && (myPedido.Coleta == null))
{
myPedido.Situacao = "P";
}
pedidos.Add(myPedido);
}
});