Error while using Parallel.Foreach

Asked

Viewed 156 times

1

I am making some improvements in a method, which today takes on average 19 to 22s to bring the information to VIEW and saw the possibility of replacing the foreach for Parallel.Foreach.

I changed and ran the code locally and it worked, even dropped to 5.68s the return to VIEW, only when running on the test server the following error:

inserir a descrição da imagem aqui

( That doesn’t happen locally.)

Follow the code with the foreach and without.

Code using foreach

foreach (DataRow dr in myDs.Tables[0].Rows)
            {
                PedidoFollowup myPedido = new PedidoFollowup()
                {
                    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);
                }
            });
  • Some of your data is incorrectly formatted when converting to Datetime, the database may be different, and the testing one is inconsistent, since the error message accuses the exception in some Convert.Todatetime

  • 1

    Probably has a string that is getting the date in a formatting, for example: 2018-07-23, and when it goes to the server this string is receiving the date in another format, such as 23-07-2018. And due to this different formatting, it fails to convert the string to a date as it does not recognize as a valid date format.

  • But locally I point to the same database that the server is pointing to.

  • As @Gustavosantos and Thiago pointed out, this could be the format problem, and this is related to the server. Locally you are using your machine’s configuration format, which may be for example dd/mm/yyyy and the server may be in English and be mm/dd/yyyyyy which may be causing error

  • Locally I am with en and the server, in web.config is with the following configuration : <globalization Culture="en-BR" uiCulture="en" />

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);
        }

Browser other questions tagged

You are not signed in. Login or sign up in order to post.