Запустите две асинхронные задачи параллельно и соберите результаты в .NET 4.5

Я некоторое время пытался получить что-то, что, как мне показалось, было бы просто работать с .NET 4.5

Я хочу запустить две длительные задачи одновременно и собрать
    результаты в лучшем C # 4.5 (RTM) способ

Следующее работает, но мне это не нравится, потому что:

I want Sleep to be an async method so it can await other methods It just looks clumsy with Task.Run() I don't think this is even using any new language features at all!

Working code:

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

Non working code:

Update: This actually works and is the correct way to do it, the only problem is the Thread.Sleep

Этот код не работает, потому что вызовSleep(5000) немедленно запускает задачу, такSleep(1000) не запускается, пока не завершится. Это правда, хотяSleep являетсяasync и я не пользуюсьawait или звонит.Result слишком рано

Я думал, может быть, есть способ получить не работаетTask<T> позвонивasync метод, чтобы я мог тогда позвонитьStart() на двух задачах, но я не могу понять, как получитьTask<T> от вызова асинхронного метода.

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

Ответы на вопрос(5)

Ваш ответ на вопрос