Я пытался какое-то время получить что-то, что, как я думал, будет просто работать с .NET 4.5
Я хочу запустить две длительные задачи одновременно и собрать приводит к лучшему пути С# 4.5 (RTM).
Следующие работы, но мне это не нравится, потому что:
-  Я хочу 
Sleepбыть асинхронным методом, чтобы он могawaitдругие методы -  Он просто выглядит неуклюжим с 
Task.Run() - Я не думаю, что это даже использование каких-либо новых функций языка вообще!
 
Рабочий код:
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;
}
Нерабочий код:
Обновление: это действительно работает, и это правильный способ сделать это, единственная проблема - это Thread.Sleep
Этот код не работает, потому что вызов Sleep(5000) сразу запускает задачу, поэтому Sleep(1000) не запускается, пока она не завершится. Это верно, даже если Sleep - async, и я не использую await или слишком быстро вызываю .Result.
Я подумал, что, возможно, есть способ получить нерабочий Task<T>, вызвав метод async, чтобы я мог затем вызвать Start() для двух задач, но я не могу понять, как получить Task<T> от вызова метода async.
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;
}