我开始在C#5.0中学习async/await,我根本不理解它.我不明白它如何用于并行.我尝试了以下非常基本的程序:
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Task task1 = Task1();
            Task task2 = Task2();
            Task.WaitAll(task1, task2);
            Debug.WriteLine("Finished main method");
        }
        public static async Task Task1()
        {
            await new Task(() => Thread.Sleep(TimeSpan.FromSeconds(5)));
            Debug.WriteLine("Finished Task1");
        }
        public static async Task Task2()
        {
            await new Task(() => Thread.Sleep(TimeSpan.FromSeconds(10)));
            Debug.WriteLine("Finished Task2");
        }
    }
}
这个程序只是阻止呼叫Task.WaitAll(),永远不会完成.有人可以向我解释原因吗?我确信我只是缺少一些简单的东西,或者只是没有正确的心理模型,并且没有任何博客或MSDN文章都有帮助.
这是我的事件处理程序代码:
protected async void TestrunSaveExecute()
{
    bool saveResult = await SaveTestRunAsync();
}
为了保持UI响应,我使用了async/ await方法.
根据我的理解,我现在可以在SaveTestRunAsync()不阻止UI的情况下进行一些冗长的操作,因为它通过使用await关键字解耦.
private async Task<bool> SaveTestRunAsync()
{
    //System.Threading.Thread.Sleep(5000); --> this blocks the UI
    await Task.Delay(5000); // this doesn't block UI
    return true;
}
你能否解释为什么Thread.Sleep仍然阻止用户界面的呼叫,而Task.Delay不是?