Executar duas tarefas assíncronas em paralelo e coletar resultados no .NET 4.5

Eu tenho tentado por um tempo para obter algo que eu pensei que seria simples trabalhar com o .NET 4.5

Eu quero disparar duas tarefas de longa duração ao mesmo tempo e recolher o
resulta na melhor maneira C # 4.5 (RTM)

O seguinte funciona, mas eu não gosto porque:

eu queroSleep para ser um método assíncrono para que ele possaawait Outros métodosParece apenas desajeitado comTask.Run()Eu não acho que isso é mesmo usando qualquer novo recurso de idioma em tudo!

Código de trabalho:

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 não funcional:

Atualização: Isso realmente funciona e é a maneira correta de fazê-lo, o único problema é oThread.Sleep

Este código não funciona porque a chamada paraSleep(5000) inicia imediatamente a tarefa em execuçãoSleep(1000) não é executado até que seja concluído. Isso é verdade mesmoSleep éasync e eu não estou usandoawait ou chamando.Result cedo demais.

Eu pensei que talvez haja uma maneira de obter uma não-execuçãoTask<T> chamando umasync método para que eu pudesse ligarStart() nas duas tarefas, mas não consigo descobrir como obterTask<T> de chamar um método assí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;
}

questionAnswers(6)

yourAnswerToTheQuestion