Ejecute dos tareas asíncronas en paralelo y recopile resultados en .NET 4.5

He estado intentando por un tiempo obtener algo que pensé que sería simple trabajar con .NET 4.5

Quiero lanzar dos tareas de larga duración al mismo tiempo y recoger el
resultados en la mejor forma de C # 4.5 (RTM)

Lo siguiente funciona pero no me gusta porque:

quieroSleep ser un método asíncrono para que puedaawait otros metodosSimplemente se ve torpe conTask.Run()¡No creo que esto sea para usar ningún nuevo lenguaje en absoluto!

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 funcional:

Actualización: esto realmente funciona y es la forma correcta de hacerlo, el único problema es elThread.Sleep

Este código no funciona porque la llamada aSleep(5000) Inmediatamente inicia la tarea ejecutándose por loSleep(1000) no se ejecuta hasta que se haya completado. Esto es cierto aunqueSleep esasync y no estoy usandoawait o llamando.Result demasiado pronto.

Pensé que tal vez hay una manera de conseguir un no-ejecuciónTask<T>&nbsp;llamando a unasync&nbsp;método para que luego pudiera llamarStart()&nbsp;en las dos tareas, pero no puedo averiguar cómo obtener unaTask<T>&nbsp;de llamar a un método así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;
}