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

posted @ 2015-07-13 13:48  捡贝壳的小哥  阅读(1294)  评论(0编辑  收藏  举报