• 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开启的线程)!至于怎么做到的(我也不知道......>_<),大家有兴趣的话研究下吧!

  • 相关阅读:
    Android EditText 文本框实现搜索和清空效果
    Android学习笔记之打钩显示输入的密码
    Mysql limit offset
    Android SDK更新以及ADT更新出现问题的解决办法
    Android Broadcast Receiver 使用入门
    立即执行函数
    JS 原型 & 继承
    JS 对象
    chrome extension overview
    JS 修改元素
  • 原文地址:https://www.cnblogs.com/xtjatswc/p/12213299.html
Copyright © 2020-2023  润新知