none
Otimizar método RRS feed

  • Pergunta

  • Olá, gostaria da opinião de vocês sobre este método.

    Existe algo que eu possa fazer para otimiza-lo?

    Hoje, ele está demorando em torno de 17 segundos para executar.

    public List<PedidoFollowup> ListaPendencia(Estabelecimento pEstabelecimento, Usuario pUsuario, int pTipoPedido, string pFiltro, string pBusca,
                string pDtInicial, string pDtFinal, int pDia, string pAlmoxarifado)
            {
                var followup = new followup(new InfraProgress().BuscaBroker(), "", "", "");
                followup.followup_listar_pendencias(pUsuario.Id, pEstabelecimento.Sigla,
                        pUsuario.Funcionario.Secao.CentroCusto.Id, pTipoPedido, pFiltro, pBusca, pDtInicial, pDtFinal, pDia, pAlmoxarifado, out dsFollowupListaPendenciasDataSet myDs);
                followup.Dispose();
                List<PedidoFollowup> pedidos = null;
                if (myDs.Tables[0].Rows.Count > 0)
                {
                    pedidos = new List<PedidoFollowup>();
    
                    decimal myQtdeTotal = 0;
                    decimal myValorTotal = 0;
    
                    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);
                        }
                    }
                }
                return pedidos;
            }

    sexta-feira, 20 de julho de 2018 14:49

Todas as Respostas

  • Bom, primeiramente precisamos entender qual trecho de código demora mais para executar.

    Você pode ter insights utilizando o StopWatch ou o MiniProfiler .

    Batendo o olho no seu código você pode utilizar o Parallel.ForEach e substituir seu foreach


    Espero ter ajudado! Se consegui, não esquece de marcar no fórum como útil! Obrigado :)
    #fullstack dev - MCSA, MCTS and actually blogging at www.saindodacaixinha.com.br

    sexta-feira, 20 de julho de 2018 20:34
  • Olá Bruno, só de mudar para o Parallel.ForEach caiu para 5,67 segundos.

    Muita diferença.


    segunda-feira, 23 de julho de 2018 14:10
  • Enviei para nosso ambiente de testes e da erro.

    Server Error in '/' Application.
    String was not recognized as a valid DateTime.
    Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
    Exception Details: System.FormatException: String was not recognized as a valid DateTime.

    Engraçado que local ele não da este problema.

    segunda-feira, 23 de julho de 2018 17:49
  • Anderson, 

    Esse erro não está relacionado ao Parallel. 

    Algum Convert.ToDateTime que está estourando essa exceção. Utilize DateTime.TryParse !


    Espero ter ajudado! Se consegui, não esquece de marcar no fórum como útil! Obrigado :)
    #fullstack dev - MCSA, MCTS and actually blogging at www.saindodacaixinha.com.br

    terça-feira, 24 de julho de 2018 02:47