C# async/await 使用总结

今天搞这两个关键字搞得有点晕,主要仍是没有完全理解其中的原理。html

 

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

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

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

若是使用 await task.ConfigureAwait(false),表示该行后的代码,都不须要必定在同一上下文中执行。线程

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

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

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

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

 

Await 的使用get

另外,因为 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

相关文章
相关标签/搜索