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

 

时间: 2024-12-30 11:29:35

C# async/await 使用总结的相关文章

如何在现有代码中通过async/await实现并行

一项新技术或者一个新特性,只有你用它解决实际问题后,才能真正体会到它的魅力,真正理解它.也期待大家能够多分享解一些解决实际问题的内容. 在我们遭遇"黑色30秒"问题的过程中,切身体会到了异步的巨大作用(详见从ASP.NET线程角度对"黑色30秒"问题的全新分析),于是开始逐步地用async/await改造现有代码. 今天早上在将一个MVC Controller中的Action改为异步的时候突然发现--其中有7个方法调用可以并行执行. public async Tas

Async/Await替代Promise的6个理由

译者按: Node.js的异步编程方式有效提高了应用性能;然而回调地狱却让人望而生畏,Promise让我们告别回调函数,写出更优雅的异步代码;在实践过程中,却发现Promise并不完美;技术进步是无止境的,这时,我们有了Async/Await. Node.js 7.6已经支持async/await了,如果你还没有试过,这篇博客将告诉你为什么要用它. Async/Await简介 对于从未听说过async/await的朋友,下面是简介: async/await是写异步代码的新方式,以前的方法有回调函

async / await:更好的异步解决方案

在实际开发中总会遇到许多异步的问题,最常见的场景接口请求之后一定要等一段时间才能得到结果,如果遇到多个接口前后依赖,那么问题就变得复杂.大家都一直在尝试使用更好的方案来解决这些问题.最开始只能利用回调函数,后来开始有人使用Promise的思维来搞定.到ES6中开始支持原生的Promise,引入Generator函数. 直到ES7,有了async/await. 这是一个用同步的思维来解决异步问题的方案. 我想很多人可能还不太分得清同步与异步的区别.如果你已经彻底了解了事件循环,那么想必对异步的概念

如何改写用async/await写的方法

问题描述 由于async/await是.Net4.5关键字,现在想用.Net2.0实现同样的功能,该如何改写?这是一个定时器的启动方法.//启动PreciseTimerpublicasyncvoidStart(){if(running)return;running=true;Reset();timestamp=RawTicks+interval;while(running){//如果把下面的timestamp=RawTicks+interval放在此行,精确度会降低awaitTask.Delay

JavaScript 的 Async/Await 完胜 Promise 的六个理由

提醒一下各位,Node 现在从版本 7.6 开始就支持 async/await 了.如果你还没有试过它,这里有一堆带有示例的理由来说明为什么你应该马上采用它,并且再也不会回头. 貌似嵌入 gist 上的代码在 medium 原生 app 中不行,但是在移动浏览器上可以.如果你是在 app 中读本文,请点击共享图标,选择"在浏览器中打开",才看得到代码片段. Async/await 101 对于那些从未听说过这个话题的人来说,如下是一个简单的介绍: Async/await 是一种编写异步

async & await 的前世今生

原文:async & await 的前世今生   async 和 await 出现在C# 5.0之后,给并行编程带来了不少的方便,特别是当在MVC中的Action也变成async之后,有点开始什么都是async的味道了.但是这也给我们编程埋下了一些隐患,有时候可能会产生一些我们自己都不知道怎么产生的Bug,特别是如果连线程基础没有理解的情况下,更不知道如何去处理了.那今天我们就来好好看看这两兄弟和他们的叔叔(Task)爷爷(Thread)们到底有什么区别和特点,本文将会对Thread 到 Tas

async/await成对匹配,不是一个死循环吗?

问题描述 async/await成对匹配,不是一个死循环吗? 要在async修饰的方法体里面使用await,被await的方法需要用async修饰.而且里面必须要有await. 这样一层一层递推下去,最后似乎必须await到一个内置的耗时方法上去,否则就没法结束.这究竟是怎么回事??? 麻烦熟悉的师兄师姐们指点迷津. 举例(简化): async void DoWork1() {//... await DoWork11(); } async Task DoWork11() {//... await

Python协程:从yield/send到async/await

这个文章理好了脉落. http://python.jobbole.com/86069/ 我练 习了一番,感受好了很多... Python由于众所周知的GIL的原因,导致其线程无法发挥多核的并行计算能力(当然,后来有了multiprocessing,可以实现多进程并行),显得比较鸡肋.既然在GIL之下,同一时刻只能有一个线程在运行,那么对于CPU密集的程序来说,线程之间的切换开销就成了拖累,而以I/O为瓶颈的程序正是协程所擅长的: 多任务并发(非并行),每个任务在合适的时候挂起(发起I/O)和恢复

async & await 的前世今生(Updated)

原文:async & await 的前世今生(Updated) async 和 await 出现在C# 5.0之后,给并行编程带来了不少的方便,特别是当在MVC中的Action也变成async之后,有点开始什么都是async的味道了.但是这也给我们编程埋下了一些隐患,有时候可能会产生一些我们自己都不知道怎么产生的Bug,特别是如果连线程基础没有理解的情况下,更不知道如何去处理了.那今天我们就来好好看看这两兄弟和他们的叔叔(Task)爷爷(Thread)们到底有什么区别和特点,本文将会对Threa