记录一次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时,则不会等待方法的执行结果,进而也不会阻塞主线程。

原文地址:https://www.cnblogs.com/pylblog/p/10401589.html