天天看点

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 相关的文章

<a href="http://www.cnblogs.com/dudu/p/async_await_parallel.html">dudu:实际案例:在现有代码中通过async/await实现并行</a>

<a href="http://wei.si/blog/2012/11/behind-async-await-keywords">有关async/await的实现背后</a>

<a href="http://www.cnblogs.com/yeagen/archive/2013/09/22/3334059.html">在mvc中使用async和await的说明</a>

<a href="http://www.cnblogs.com/jesse2013/p/async-and-await.html">async &amp; await 的前世今生(updated)</a>

<a href="http://jaylee.org/post/2012/06/18/csharp-5-0-async-tips-and-tricks-part-1.aspx">c# 5.0 async tips and tricks, part 1</a>

<a href="http://blog.stephencleary.com/2012/02/async-and-await.html">async and await</a>

继续阅读