He estado tratando durante algún tiempo para conseguir algo que pensé que sería sencillo trabajar con .NET 4.5ejecutar dos tareas asíncronas en paralelo y recogen los resultados en .NET 4.5
Quiero disparar dos tareas en ejecución largos al mismo tiempo y recoger las
resultados en la mejor C# 4.5 manera (RTM)
las siguientes obras pero no me gusta porque:
- Quiero
Sleep
ser un método asíncrono por lo puedeawait
oth er métodos - Parece torpe con
Task.Run()
- ¡No creo que esto esté usando ninguna característica de lenguaje nuevo!
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 no laborables:
Actualización: Esta realmente funciona y es la forma correcta de hacerlo, el único problema es la Thread.Sleep
Este código no funciona porque la cal l a Sleep(5000)
inicia inmediatamente la tarea ejecutándose para que Sleep(1000)
no se ejecute hasta que se complete. Esto es cierto aunque Sleep
es async
y no estoy usando await
o llamando al .Result
demasiado pronto.
pensé que tal vez hay una manera de conseguir una que no se corre Task<T>
llamando a un método async
así que entonces podría llamar Start()
en las dos tareas, pero no puedo encontrar la manera de conseguir un Task<T>
de llamar a un asíncrono método.
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;
}
nota: Ir haciendo un método asíncrono hace ninguna diferencia –
bloque que está pasando en ' task1.Result' no en 'var task1 = Sleep (5000)' porque su método Sleep sin una palabra clave await es sincrónico – Arvis