zoukankan      html  css  js  c++  java
  • C#异步编程 Task await的理解

    async/await是C#5.0中推出的,先上用法:

    static void Main(string[] args)
    {
        Console.WriteLine("-------主线程启动-------");
        Task<int> task = GetStrLengthAsync();
        Console.WriteLine("主线程继续执行");
        Console.WriteLine("Task返回的值" + task.Result);
        Console.WriteLine("-------主线程结束-------");
    }
     
    static async Task<int> GetStrLengthAsync()
    {
        Console.WriteLine("GetStrLengthAsync方法开始执行");
        //此处返回的<string>中的字符串类型,而不是Task<string>
        string str = await GetString();
        Console.WriteLine("GetStrLengthAsync方法执行结束");
        return str.Length;
    }
     
    static Task<string> GetString()
    {
       //Console.WriteLine("GetString方法开始执行")
        return Task<string>.Run(() =>
        {
            Thread.Sleep(2000);
            return "GetString的返回值";
        });
    }

    async用来修饰方法,表明这个方法是异步的,声明的方法的返回类型必须为:void,Task或Task<TResult>。

    await必须用来修饰Task或Task<TResult>,而且只能出现在已经用async关键字修饰的异步方法中。通常情况下,async/await成对出现才有意义,

    看看运行结果:

    可以看出来,main函数调用GetStrLengthAsync方法后,在await之前,都是同步执行的,直到遇到await关键字,main函数才返回继续执行。

    那么是否是在遇到await关键字的时候程序自动开启了一个后台线程去执行GetString方法呢?

    现在把GetString方法中的那行注释加上,运行的结果是:

    大家可以看到,在遇到await关键字后,没有继续执行GetStrLengthAsync方法后面的操作,也没有马上反回到main函数中,而是执行了GetString的第一行,以此可以判断await这里并没有开启新的线程去执行GetString方法,而是以同步的方式让GetString方法执行,等到执行到GetString方法中的Task<string>.Run()的时候才由Task开启了后台线程!

    那么await的作用是什么呢?

    可以从字面上理解,上面提到task.wait可以让主线程等待后台线程执行完毕,await和wait类似,同样是等待,等待Task<string>.Run()开始的后台线程执行完毕,不同的是await不会阻塞主线程,只会让GetStrLengthAsync方法暂停执行。

    那么await是怎么做到的呢?有没有开启新线程去等待?

    只有两个线程(主线程和Task开启的线程)!至于怎么做到的(我也不知道......>_<),大家有兴趣的话研究下吧!

  • 相关阅读:
    codeforces 980A Links and Pearls
    zoj 3640 Help Me Escape
    sgu 495 Kids and Prizes
    poj 3071 Football
    hdu 3853 LOOPS
    hdu 4035 Maze
    hdu 4405 Aeroplane chess
    poj 2096 Collecting Bugs
    scu 4444 Travel
    zoj 3870 Team Formation
  • 原文地址:https://www.cnblogs.com/xtjatswc/p/12213299.html
Copyright © 2011-2022 走看看