Error when using Parallel.Foreach

0

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);
                }
            });
    
asked by anonymous 23.07.2018 / 21:10

1 answer

0

Use the TryParseExact to convert your date, see the example below.

string[] formats = {"M/d/yyyy h:mm:ss tt", "M/d/yyyy h:mm tt",
                         "MM/dd/yyyy hh:mm:ss", "M/d/yyyy h:mm:ss",
                         "M/d/yyyy hh:mm tt", "M/d/yyyy hh tt",
                         "M/d/yyyy h:mm", "M/d/yyyy h:mm",
                         "MM/dd/yyyy hh:mm", "M/dd/yyyy hh:mm"};

        string[] dateStrings = {"5/1/2009 6:32", "05/01/2009 6:32:05",
                              "5/1/2009 6:32:00", "05/01/2009 06:32",
                              "05/01/2009 06:32:00", "05/01/2009 06:32:00"};
        DateTime dateValue;

        foreach (string dateString in dateStrings)
        {
            if (DateTime.TryParseExact(dateString, formats, new CultureInfo("pt-BR"), DateTimeStyles.None,
                                       out dateValue))
                Console.WriteLine("Converted '{0}' to {1}.", dateString, dateValue);
            else
                Console.WriteLine("Unable to convert '{0}' to a date.", dateString);
        }
    
25.07.2018 / 15:13