1
resposta

Problema de retorno nulo Factory.StartNew

Pessoal, estou tendo um problema que aparece de vez em quando, tenho essa função, que ainda não está completa (pois faltam muitos cálculos e condições). as vezes no final quando dou o retono.OrderBy(...) está dando problema de nulo, os dados desse ponto ficam todos nulos, não sei se alguém conseguiria me ajudar.

 private Task<List<Ponto_Sensivel_Simulacao>> Get_Pontos_Sensiveis_Simulacao()
        {
            Ponto_SensivelController ponto_SensivelController = new Ponto_SensivelController();
            var Pontos = ponto_SensivelController.GetPonto_Sensivel().ToList();
            var retono = new List<Ponto_Sensivel_Simulacao>();

            var tasks = Pontos.Select(ponto =>
            {
                return Task.Factory.StartNew(() =>
                {
                    var ponto_Possivel_Derramamento = dados_Simulacao.ponto_Possivel_Derramamento;
                    var ponto_Simulacao = new Ponto_Sensivel_Simulacao();
                    ponto_Simulacao.Ponto_Sensivel_ID = ponto.Ponto_Sensivel_ID;
                    ponto_Simulacao.Ponto_Sensivel_Latitudade = ponto.Ponto_Sensivel_Latitudade;
                    ponto_Simulacao.Ponto_Sensivel_Longitudade = ponto.Ponto_Sensivel_Longitudade;
                    ponto_Simulacao.Ponto_Sensivel_Nome = ponto.Ponto_Sensivel_Nome;

                    ponto_Simulacao.Ponto_Sensivel_Simulacao_Distancia = CalcularDistancia(
                            ponto_Possivel_Derramamento.Ponto_Possivel_Derramamento_Corpo_Hidrico_Latitudade,
                            ponto_Possivel_Derramamento.Ponto_Possivel_Derramamento_Corpo_Hidrico_Longitudade,
                            ponto.Ponto_Sensivel_Latitudade,
                            ponto.Ponto_Sensivel_Longitudade
                        );

                    ponto_Simulacao.Ponto_Sensivel_Simulacao_Data_Alcance = dados_Simulacao.Dados_Simulacao_Data.AddSeconds(ponto_Simulacao.Ponto_Sensivel_Simulacao_Distancia);
                    ponto_Simulacao.Ponto_Sensivel_Simulacao_Prioridade = 1;
                    var DiferencaEmsegundos = (ponto_Simulacao.Ponto_Sensivel_Simulacao_Data_Alcance - dados_Simulacao.Dados_Simulacao_Data).TotalSeconds;
                    var DiferencaHoras = Math.Floor((DiferencaEmsegundos / 3600));
                    var DiferencaMinutos = Math.Floor((DiferencaEmsegundos % 3600) / 60);
                    ponto_Simulacao.Ponto_Sensivel_Simulacao_Tempo = DiferencaHoras.ToString() + ":" + DiferencaMinutos.ToString() + " h";

                    if (ListaPontosTemp.Contains(ponto.Ponto_Sensivel_Nome))
                    //if (ponto_Simulacao.Ponto_Sensivel_Simulacao_Distancia < 10000)
                    {
                        retono.Add(ponto_Simulacao);
                    }
                });
            });

            return Task.WhenAll(tasks).ContinueWith(x =>
            {
                return retono.OrderBy(y => y.Ponto_Sensivel_Simulacao_Data_Alcance).ToList();
            });
        }
1 resposta

Olá Guilherme, tudo bem?

Acredito que em algum ponto pode ser cabível o uso do .Wait() para segurar a execução até que a task esteja pronta. Talvez na linha retono.Add(ponto_Simulacao);. Mas sem o código em mãos fica complicado de indicar onde seria o melhor lugar de usar esse método.

Mas como é um projeto pessoal, acredito que seja mais interessante o uso de async / await, afinal com isso corta um belo caminho.

Documentação sobre Wait().

Documentação sobre async / await.

Bons estudos!