この例は、違いを非常に明確に示しています。async / awaitを使用すると、呼び出しスレッドはブロックせず、実行を継続します。
static void Main(string[] args)
{
    WriteOutput("Program Begin");
    // DoAsTask();
    DoAsAsync();
    WriteOutput("Program End");
    Console.ReadLine();
}
static void DoAsTask()
{
    WriteOutput("1 - Starting");
    var t = Task.Factory.StartNew<int>(DoSomethingThatTakesTime);
    WriteOutput("2 - Task started");
    t.Wait();
    WriteOutput("3 - Task completed with result: " + t.Result);
}
static async Task DoAsAsync()
{
    WriteOutput("1 - Starting");
    var t = Task.Factory.StartNew<int>(DoSomethingThatTakesTime);
    WriteOutput("2 - Task started");
    var result = await t;
    WriteOutput("3 - Task completed with result: " + result);
}
static int DoSomethingThatTakesTime()
{
    WriteOutput("A - Started something");
    Thread.Sleep(1000);
    WriteOutput("B - Completed something");
    return 123;
}
static void WriteOutput(string message)
{
    Console.WriteLine("[{0}] {1}", Thread.CurrentThread.ManagedThreadId, message);
}
DoAsTask出力:
[1]プログラムの開始
[1] 1-開始
[1] 2-タスクが開始されました
[3] A-何かを始めました
[3] B-何かを完成させた
[1] 3-タスクが完了し、結果:123
[1]プログラム終了
DoAsAsync出力:
[1]プログラムの開始
[1] 1-開始
[1] 2-タスクが開始されました
[3] A-何かを始めました
[1]プログラム終了
[3] B-何かを完成させた
[3] 3-タスクが完了し、結果:123
更新:スレッドIDを出力に表示することにより、例を改善しました。
               
              
Task10ミリ秒かかるを待つことが実際にTaskスレッドで10時間実行され、10時間全体がブロックされる場合、どのようにしますか?