He estado intentando durante un tiempo conseguir algo que pensé que sería sencillo trabajar con .NET 4.5
Quiero iniciar dos tareas de ejecución prolongada al mismo tiempo y recopilar los
resultados de la mejor manera C # 4.5 (RTM)
Lo siguiente funciona pero no me gusta porque:
- Quiero
Sleep
ser un método asincrónico para que puedaawait
otros métodos - Simplemente se ve torpe con
Task.Run()
- ¡No creo que esto esté usando ninguna característica de idioma nueva en absoluto!
Código de trabajo:
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 que no funciona:
Actualización: esto realmente funciona y es la forma correcta de hacerlo, el único problema es el Thread.Sleep
Este código no funciona porque la llamada a Sleep(5000)
inicia inmediatamente la ejecución de la tarea, por lo Sleep(1000)
que no se ejecuta hasta que se completa. Esto es cierto a pesar de que lo Sleep
es async
y no estoy usando await
o llamando .Result
demasiado pronto.
Pensé que tal vez había una manera de hacer que no se ejecutara Task<T>
llamando a un async
método para luego poder llamar Start()
a las dos tareas, pero no puedo averiguar cómo obtener una Task<T>
llamando a un método así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
not at var task1 = Sleep(5000)
porque su método Sleep sin una palabra clave await es sincrónico.