首页 新闻 会员 周边

如何正确理解.NET 4.5和C# 5.0中的async/await异步编程模式?

0
悬赏园豆:5 [待解决问题]

最近在看《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异步编程模式?

跟着阿笨一起玩.NET的主页 跟着阿笨一起玩.NET | 初学一级 | 园豆:9
提问于:2017-05-11 16:33
< >
分享
所有回答(2)
0

我的理解是await不是在Ui线程运行的,

你说的await不生成线程,也是可以的啊,应该是利用操作系统,所以应用程序不需要线程

博学多思 | 园豆:76 (初学一级) | 2017-05-11 19:21
0

因为。。。。btnDoStuff_Click 本身是被异步执行(调用)的 注意看 async 关键字。

具体看 http://www.cnblogs.com/bnbqian/p/4513192.html 中的 同步调用异步async防止死锁方案

SoarNo1 | 园豆:195 (初学一级) | 2017-05-12 05:52
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册