Uruchom równolegle dwa zadania asynchroniczne i zbierz wyniki w .NET 4.5

Próbowałem przez chwilę uzyskać coś, co wydawało mi się proste w pracy z .NET 4.5

Chcę odpalić dwa długie zadania w tym samym czasie i zebrać
skutkuje najlepszym sposobem C # 4.5 (RTM)

Poniższe działa, ale nie podoba mi się, ponieważ:

chcęSleep być metodą asynchroniczną, więc możeawait inne metodyPo prostu wygląda niezgrabnieTask.Run()Nie sądzę, żeby to w ogóle wykorzystywało jakiekolwiek nowe funkcje językowe!

Kod roboczy:

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

Nie działający kod:

Aktualizacja: To rzeczywiście działa i jest to właściwy sposób, jedynym problemem jestThread.Sleep

Ten kod nie działa z powodu wywołaniaSleep(5000) natychmiast uruchamia zadanie takSleep(1000) nie działa dopóki się nie zakończy. To prawda, chociażSleep jestasync i nie używamawait lub dzwoniąc.Result zbyt wcześnie.

Myślałem, że może jest jakiś sposób na uruchomienieTask<T> dzwoniąc doasync więc mogę zadzwonićStart() w dwóch zadaniach, ale nie mogę wymyślić, jak uzyskaćTask<T> od wywołania metody asynchronicznej.

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

questionAnswers(6)

yourAnswerToTheQuestion