Führen Sie zwei asynchrone Tasks gleichzeitig aus und erfassen Sie die Ergebnisse in .NET 4.5
Ich habe eine Weile versucht, etwas zu bekommen, von dem ich dachte, dass es einfach wäre, mit .NET 4.5 zu arbeiten
Ich möchte zwei lange laufende Aufgaben gleichzeitig abfeuern und die sammeln
führt zu der besten C # 4.5 (RTM) -Methode
Folgendes funktioniert, aber ich mag es nicht, weil:
Ich willSleep
eine asynchrone Methode zu sein, so kann esawait
andere MethodenEs sieht einfach ungeschickt ausTask.Run()
Ich glaube nicht, dass dies überhaupt irgendwelche neuen Sprachfunktionen nutzt!Arbeitscode:
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;
}
Nicht funktionierender Code:
Update: Dies funktioniert tatsächlich und ist der richtige Weg, das einzige Problem ist dasThread.Sleep
Dieser Code funktioniert nicht, weil der Aufruf anSleep(5000)
sofort startet die aufgabe soSleep(1000)
läuft erst, wenn es abgeschlossen ist. Das ist wahr, obwohlSleep
istasync
und ich benutze nichtawait
oder anrufen.Result
zu früh.
Ich dachte, vielleicht gibt es einen Weg, ein Rennen zu beendenTask<T>
durch einen anruf anasync
methode könnte ich dann anrufenStart()
auf die beiden Aufgaben, aber ich kann nicht herausfinden, wie man einen bekommtTask<T>
vom Aufrufen einer asynchronen Methode.
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;
}