最近在看《C#图解教程》,其中第20章讲解了.NET 4.5和C# 5.0新添加的异步编程模型async/await,举了一个在GUI中执行异步操作的例子:
private async void btnDoStuff_Click(object sender, RoutedEventArgs e)
{
btnDoStuff.IsEnabled = false;
lblStatus.Content = "Doing Stuff";
await Task.Delay(4000);
lblStatus.Content = "Not Doing Anything";
btnDoStuff.IsEnabled = true;
}
上面这个方法是一个按钮空间Click事件的事件响应代码。
我的问题是:按照我的理解,控件的响应代码应该是在GUI线程里面被调用的,而且对于GUI应用程序来说,GUI线程一般只有一个,并且所有和GUI控件方面的交互都应该通过GUI线程来完成。那么用await修饰的异步方法是在哪个线程中被调用的?为什么上面这个事件处理方法不会阻塞GUI?
我还看到其它一些描述是说使用async/await异步模式不会生成新的线程,那么只在原来已有线程的基础上面如何做到异步运行?
总之,如何正确理解.NET 4.5和C# 5.0中的async/await异步编程模式?
我的理解是await不是在Ui线程运行的,
你说的await不生成线程,也是可以的啊,应该是利用操作系统,所以应用程序不需要线程
因为。。。。btnDoStuff_Click 本身是被异步执行(调用)的 注意看 async 关键字。
具体看 http://www.cnblogs.com/bnbqian/p/4513192.html 中的 同步调用异步async防止死锁方案