zoukankan      html  css  js  c++  java
  • 记录一次C#的asyn和await

    static void Main(string[] args)
    {
               
                var d = new NavDownLoader();
                Task<bool> success = d.DownLoadLatestNavAsync();
    
                Console.WriteLine("等....");
                Console.WriteLine("结果:" + success.Result.ToString());
            Console.WriteLine("完成");

            Console.ReadKey();
    }

    已知DownLoadLatestNavAsync()是一个耗时10s+的方法,现在这个代码,效果就是:

    1.  马上打印    "等...."

    2.  在10s + 之后,打印  “结果:false”;

    3.  在第2步之后,马上打印  “完成”

      public class NavDownLoader
        {
            /// <summary>
            /// 异步下载
            /// </summary>
            /// <returns></returns>
            public async Task<bool> DownLoadLatestNavAsync()
            {
                bool success = false;
                await Task.Run(new Action(() =>
                {
                    success = DownLoadLatestNav();
                }));
                return success;
            }
          
            /// <summary>
            /// 同步下载
            /// </summary>
            /// <returns></returns>
            public bool DownLoadLatestNav()
            {
                Thread.Sleep(10000);
            }
    } 

    在DownLoadLatestNavAsync(),中:

    1. 等了10s才执行到:return success; 也就是说,await这句,对于DownLoadLatestNavAsync()是阻塞的

    而且,async 方法中,如果不添加await 关键字,会有提示警告!告诉你这个方法将会同步执行。(我理解是,被它的调用者(main函数)同步执行,不执行完它,它的调用者就进行不下去)

    结论:

    1. 调用async方法时,是异步调用的,马上去执行下面的语句。

    2. 如果执行完主函数的语句后,使用Task.Result获取结果的时候,如果async方法没完成,会卡在那里。

    3. 在async方法体中,要有  “await + 耗时操作” 这样的语句,而且这个语句会阻塞它后面的语句。

    4. await + 耗时操作语句,也可以表现为 bool success = await DownLoadLatestNav();   要注意的是,此时 public async Task<bool> DownLoadLatestNav() ,忽略掉await的警告即可。

    *在习惯上应该await  xxxx_async();await关键字,是说明,最终在哪个地方“耗时”;

    其他参考:https://www.cnblogs.com/liqingwen/p/5831951.html

    Task类型的方法(返回Task<T>的方法),在被调用时,会在方法的前面加上await,表示需要等待此方法的执行结果,再继续执行后面的代码。但如果不加await时,则不会等待方法的执行结果,进而也不会阻塞主线程。

  • 相关阅读:
    在chrome插件开发中,如何executeScript多个content script文件
    [Silverlight]MVVM+MEF框架Jounce练习(1)
    EF的日期运算
    【silverlight】Silverlight TreeViw默认展开节点
    singleton pattern简单随笔
    Design pattern形象比喻
    C#简单选择排序
    回文算法
    C#插入排序
    Jquery调用存储过程实例
  • 原文地址:https://www.cnblogs.com/pylblog/p/10401589.html
Copyright © 2011-2022 走看看