Estou tentando há um tempo algo que achei que seria simples trabalhar com .NET 4.5
Quero iniciar duas tarefas de longa duração ao mesmo tempo e coletar os
resultados da melhor maneira C # 4.5 (RTM)
O seguinte funciona, mas não gosto porque:
- Eu quero
Sleep
ser um método assíncrono para que possaawait
outros métodos - Parece desajeitado com
Task.Run()
- Não acho que isso esteja usando novos recursos de linguagem!
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 fazer isso, o único problema é o Thread.Sleep
Este código não funciona porque a chamada para Sleep(5000)
inicia imediatamente a execução da tarefa, portanto, Sleep(1000)
não é executada até que seja concluída. Isto é verdade mesmo que Sleep
é async
e eu não estou usando await
ou chamar .Result
muito cedo.
Eu pensei que talvez houvesse uma maneira de obter uma não execução Task<T>
chamando um async
método para que eu pudesse chamar Start()
as duas tarefas, mas não consigo descobrir como obter um Task<T>
chamando 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;
}
task1.Result
não em var task1 = Sleep(5000)
porque seu método Sleep sem uma palavra-chave await é síncrono.