Async Await 工作流程和作用

从多线程最常用的场景模式说起。

比如下面的一段代码, 函数中需要从远程获取数据, 这个过程可能需要10多秒或者更长,甚至网络可能断了。那么调用这个函数的界面将“死卡”住。

 

只要编程语言支持多线程,这个问题便可以解决。便能构建所谓的响应式程序。所以很多文档说async, await 是为了构建响应式程序。在我看来,并不如此,就是在c# 支持Task之前,就可以使用比较底层的Thread对象,但是需要创建线程,启动线程,停止线程等操作。除了这些步骤之后,因为线程是内核对象,管理不善,很容易在程序退出时还驻留于系统中,导致程序并不是完全地退出。

C#在 C# 4.0引入Task,它提供了一种比thread更简单的方式来使用多线程。但是如何得到Task所在的线程的结果,方式是非常有限的。而有了async,await之后,使用多线程形式便如同单线程一样简单,并且安全有保障。

但是这个“简单”是有条件,在真正理解多线程程序的写法及运行以及明白 async, await的使用规则后,这个新语法才能给你“精美高效”的感觉。

多线程的实质及原理就不说,网上有太多说得比我好,我学习多线程也做过一些笔记“  https://blog.csdn.net/mochounv/article/details/52217297 ”。

现在谈async, await使用的基本规则。

一、async, await的工作流

 

在使用传统的Thread,我们会把第2步中的耗时语句移到线程函数中。为了使程序按以1、2、3的顺序执行,且界面不会卡顿,这时我们需要把这语句封装到一个函数,作为线程函数,将第3步的语句封装成另一个函数,作为线程序函数执行完成的一个回调函数。一个本应一气呵成的逻辑因为多线程的语法限制,分离于程序的各个部分。

二、 async, await 的作用

有了async, await以后,以上代码可以在成以下样的

 

整个逻辑紧密相关的代码写在一起,但是界面不再卡断了。

这就是async, await的功劳。当一个函数中有需要在非当前线程执行的代码时,可以使用async 来修饰这个函数,对于需要放到非当前线程的语句,需要在前面添加await。

Await 关键字会使得当前线程停止执行往下代码(注意,但是当前线程并没有停止),当前线程继续接收用户的其它输入,所以界面就不会卡住;

只有当await得到可用的结果时,当前线程才会把剩下的没有执行的代码执行。可见,await 除了启动新线程,所以对开发人员来说,编写代码的方式不需要因为不同线程切换上、下文而把本应相关的代码分散各处。

那么,如果单独async 修饰方法名时,是否也能得到这个效果呢,根据以上分析不难看出,起异步作用的是await。所以显然是不行。以上代码,如果仅仅使用async,那么界面依然会卡顿。

如果我们在方法修饰中,把async task改为void,编译器会报错告诉我们

Error        CS4033        The 'await' operator can only be used within an async method. Consider marking this method with the 'async' modifier and changing its return type to 'Task'。

先不管return type "task",至少很明确,使用await的时一定要使用async.

综上所述,async,await的结合使用,隐藏了不同线程切换上下文的细节,开发者可以像编写单线程同步代码一样写多线程代码。

 

在下一篇中讲 如何使用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值