zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    心得
    第七章
    第六章
    第五章
    第四章
    第三章
    第二章
    第一章
    实验2(4)
    实验2(3)
  • 原文地址:https://www.cnblogs.com/zgynhqf/p/4498718.html
Copyright © 2011-2022 走看看