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;
}

Antworten auf die Frage(6)

Ihre Antwort auf die Frage