C# async/await 使用总结

今天搞这两个关键字搞得有点晕,主要还是没有彻底理解其中的原理。

 

混淆了一个调用异步方法的概念:

在调用异步方法时,虽然方法返回一个 Task,但是其中的代码已经开始执行。该方法在调用时,即刻执行了一部分代码,直接最底层的 Async API 处才产生真正的异步操作,这时向上逐步返回,并最终使用一个 Task 来代表该异步任务。

当不使用 await 关键字时,该异步方法同样在异步执行。而使用 await 关键字后,只不过是对 Task(awaitable) 对象异步等待其执行结束,然后再同上下文中执行后续代码。

如果使用 await task.ConfigureAwait(false),表示该行后的代码,都不需要一定在同一上下文中执行。

也就是说,对于 Task Run() 的调用来说:

1. RunAsync():直接执行该异步方法,后续代码紧接着执行。

2. await RunAsync():执行异步方法,并在结束后再执行后续代码(在此行代码之前的代码在同一线程中执行)。

3. await RunAsync().ConfigureAwait(false):执行异步方法,并在结束后再执行后续代码(执行的线程不指定)。

 

Await 的使用

另外,由于 await 只针对 awaitable 对象,所以并不要求一定要在异步方法之前使用。可以在适当的时候再使用 await,例如:

var task = RunAsync();//开始执行异步操作。

DoSth();//同时主线程执行其它操作。

await task;//此时等待异步执行完成。

DoOtherThing();//再执行其它操作。

 

参考:

下面,列出几篇  async await 相关的文章

dudu:实际案例:在现有代码中通过async/await实现并行

有关async/await的实现背后

在MVC中使用async和await的说明

async & await 的前世今生(Updated)

C# 5.0 Async Tips and Tricks, Part 1

Async and Await

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值