Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Dúvida] Trecho de código C# Async/Await não funciona

Olá, estou estudando Tasks em C#, montei o seguinte código e não funciona:

public async void Metodo3() { List ltipos = new List() { 1, 2, 3, 4 };

        var res = await TarefaAsync(ltipos);

        foreach (double r in res)
        {
            Console.WriteLine("Resultado: " + r);
        }
    }

    public Task<List<double>> TarefaAsync(List<int> ltipos)
    {
        List<double> resultado = new List<double>();
        var tarefa = ltipos.Select(tipo =>
        {
            return Task.Factory.StartNew(() =>
            {
                var resultadoBusca = BuscaLista(tipo);
                resultado.AddRange(resultadoBusca);
            });
        });

        return Task.WhenAll(tarefa).ContinueWith(t =>
        { 
            return resultado;
        });
    }


    public List<double> BuscaLista(int tipo)
    {
        int inicio;
        int fim;
        List<double> resultado = new List<double>();
        switch (tipo)
        {
            case 1:
                inicio = 1;
                fim = 19999;
                break;
            case 2:
                inicio = 20000;
                fim = 29999;
                break;
            case 3:
                inicio = 30000;
                fim = 39999;
                break;
            case 4:
            default:
                inicio = 40000;
                fim = 49999;
                break;
        }

        int div = 0;
        for (int i = inicio; i < fim; i++)
        {
            div = i % 3;
            if (div == 0)
            {
                resultado.Add(i);
                Console.WriteLine(tipo+ " Achei: " + i);
            }
        }

        return resultado;
    }
1 resposta
solução!

Olá! Como vc está fazendo a chamada do método Metodo3()?

Se estiver assim:

Metodo3()

Acho que até funciona, mas como está sem o await, é como se o código não aguardasse pela execução das tarefas.

Testei aqui e funcionou colocando o await na chamada do método.

await Metodo3();

Além disso, é preciso alterar a declaração do Metodo3 de void para Task.

public async Task Metodo3()
{
    var ltipos = new List<int>() { 1, 2, 3, 4 };

    var res = await TarefaAsync(ltipos);

    foreach (double r in res)
    {
        Console.WriteLine("Resultado: " + r);
    }
}

O uso do Task ao invés do void é recomendado pela própria Microsoft aqui

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software