zoukankan      html  css  js  c++  java
  • async/await的实质理解

        async/await关键字能帮助开发者更容易地编写异步代码。但不少开发者对于这两个关键字的使用比较困惑,不知道该怎么使用。本文就async/await的实质作简单描述,以便大家能更清楚理解。

        一、async的实质

        async的实质是告诉调用者,async标记的方法可能包含异步代码。具体来说,以wait以分界点,async标记的方法被分为三个片段:

    static async void TestAsyncMethod()
    {
       someCode1(); //片段1
       await Thask.Run(...); //片段2
       comeCode3(); //片段3
    }
    View Code
    • 代码片段1与调用者同属一个线程,属同步代码。
    • 代码片段2表示await引起的异步代码,另起一个线程。
    • 代码片段3在await之后,表示该异步代码后的回调代码。

        这3个代码片段顺序固定,但均不要求一定出现。

        二、await的实质

        await一定出现在async标记的代码中,表示后面挂起一段线程代码,而await异步代码后在代码均表示回调代码。代码示意如下:

    await 异步代码;
    回调代码;
    View Code

        await挂起的异步代码通常有3种情况:

    • await后调用async标记的方法
    • await Task.Run(...);
    • await Task<TResult>.Run(...);

        三、代码示例

        1、async中只有同步代码

        代码:

            static void Main(string[] args)
            {
                Console.Title = "Async/Await测试";
                MyAsync1();
                Console.WriteLine("Test1");
                Console.ReadLine();
            }
    
            static async void MyAsync1()
            {
                Console.WriteLine("Test2");
                Thread.Sleep(TimeSpan.FromSeconds(2));
                Console.WriteLine("Test3");
            }
    View Code

        输出结果:

    Test2
    Test3
    Test1

        2、async中含有异步代码

        代码:

            static void Main(string[] args)
            {
                Console.Title = "Async/Await测试";
                MyAsync2();
                Console.WriteLine("Test1");
                Console.ReadLine();
            }
    
            static async void MyAsync2()
            {
                Console.WriteLine("Test4");
                Console.WriteLine(await Task<string>.Run(() =>
                {
                    Thread.Sleep(TimeSpan.FromSeconds(2));
                    return "Tao";
                }));
                Console.WriteLine("Test5");
            }
    View Code

        输出结果:

    Test4
    Test1
    Tao
    Test5

  • 相关阅读:
    [BinaryTree] AVL树、红黑树、B/B+树和Trie树的比较
    [C/C++] 堆和栈的区别
    HBuilde H5开发,关于JSON的Storage存储
    你是怎么调试 JavaScript 程序
    plus.webview.create mui.openWindow区别是什么呢
    H5本地存储详细使用教程(localStorage + JSON数据存储应用框架)
    [工具教程] HBuilder调试夜神安卓模拟器方法(该方法真实有效)
    HBuilder使用夜神模拟器调试Android应用
    Android如何使用API
    Linux下安装方法总结(源码安装)
  • 原文地址:https://www.cnblogs.com/huatao/p/4642690.html
Copyright © 2011-2022 走看看