Executar duas tarefas assíncronas em paralelo e coletar resultados no .NET 4.5
Eu tenho tentado por um tempo para obter algo que eu pensei que seria simples trabalhar com o .NET 4.5
Eu quero disparar duas tarefas de longa duração ao mesmo tempo e recolher o
resulta na melhor maneira C # 4.5 (RTM)
O seguinte funciona, mas eu não gosto porque:
eu queroSleep
para ser um método assíncrono para que ele possaawait
Outros métodosParece apenas desajeitado comTask.Run()
Eu não acho que isso é mesmo usando qualquer novo recurso de idioma em tudo!Código de trabalho:
public static void Go()
{
Console.WriteLine("Starting");
var task1 = Task.Run(() => Sleep(5000));
var task2 = Task.Run(() => Sleep(3000));
int totalSlept = task1.Result + task2.Result;
Console.WriteLine("Slept for a total of " + totalSlept + " ms");
}
private static int Sleep(int ms)
{
Console.WriteLine("Sleeping for " + ms);
Thread.Sleep(ms);
Console.WriteLine("Sleeping for " + ms + " FINISHED");
return ms;
}
Código não funcional:
Atualização: Isso realmente funciona e é a maneira correta de fazê-lo, o único problema é oThread.Sleep
Este código não funciona porque a chamada paraSleep(5000)
inicia imediatamente a tarefa em execuçãoSleep(1000)
não é executado até que seja concluído. Isso é verdade mesmoSleep
éasync
e eu não estou usandoawait
ou chamando.Result
cedo demais.
Eu pensei que talvez haja uma maneira de obter uma não-execuçãoTask<T>
chamando umasync
método para que eu pudesse ligarStart()
nas duas tarefas, mas não consigo descobrir como obterTask<T>
de chamar um método assíncrono.
public static void Go()
{
Console.WriteLine("Starting");
var task1 = Sleep(5000); // blocks
var task2 = Sleep(1000);
int totalSlept = task1.Result + task2.Result;
Console.WriteLine("Slept for " + totalSlept + " ms");
}
private static async Task<int> Sleep(int ms)
{
Console.WriteLine("Sleeping for " + ms);
Thread.Sleep(ms);
return ms;
}