【C#】async和await

发布于:2022-11-01 ⋅ 阅读:(282) ⋅ 点赞:(0)

大概理解

查了一个小时的资料:async和await

发现这个大神的解释一针见血,深得我心!以最简单的例子,解释了async和await。妙~~~

大多情况下,分开才能体现async和await的价值!

 但,await 并没有这么简单。

深入分析

接下来继续往下看:

await Task.Delay(3000);  和Task.Delay(3000).Wait();   有没有区别?

上代码:

using System.Diagnostics;

namespace await_async2
{
    internal class Program
    {

        static  public void TestWait()
        {
            var t = Task.Factory.StartNew(() =>
            {
                Console.WriteLine("Start");
                Task.Delay(3000).Wait();
                Console.WriteLine("Done");
            });
            t.Wait();
            Console.WriteLine("All done");
        }


        static public void TestWait2()
        {
            var t = Task.Factory.StartNew(async () =>
            {
                Console.WriteLine("Start");
                await Task.Delay(3000);
                Console.WriteLine("Done");
            });
            t.Wait();
            Console.WriteLine("All done");
        }



        static public void TestWait3()
        {
            var t = Task.Run(async () =>
            {
                Console.WriteLine("Start");
                await Task.Delay(3000);
                Console.WriteLine("Done");
            });
            t.Wait();
            Console.WriteLine("All done");
        }



        static void Main(string[] args)
        {
            TestWait2();
            //避免程序提前退出,导致一些现象看不到
            Task.Delay(5000).Wait();
        }
    }
}

首先,强调一下,最后一句 Task.Delay(5000).Wait(); 是必须的,不然,程序提前退出,导致一些现象看不到,从而蒙蔽了我们。

第1段代码TestWait执行效果,如下:

 

第2段代码TestWait2执行效果,如下:

 

第3段代码TestWait3执行效果,如下:

 现在给出结论:

Task.Delay(3000).Wait(); 这个就是同步等。

await Task.Delay(3000); 因为没有分开来写(见第一张图),所以基本和同步等没有区别。

但是如果 await Task.Delay(3000); 是写到:Task.Factory.StartNew里面的

static public void TestWait2()
        {
            var t = Task.Factory.StartNew(async () =>
            {
                Console.WriteLine("Start");
                await Task.Delay(3000);
                Console.WriteLine("Done");
            });
            t.Wait();
            Console.WriteLine("All done");
        }

那这个效果不一样了,他们执行的权限丢出去了有点像python里的yeild,来看下程序的执行顺序:

 这里就看出了:await Task.Delay(3000);  和Task.Delay(3000).Wait(); 的区别了。(但是这种情况如果在道Task.Run里面就体现不出来!)

然后,我有简单做了一个实验:

这就更明了了, await Task.Delay(3000); 就像设置了一个回调,一旦三秒时间一到,程序的指针就会回到await Task.Delay(3000);后面的位置,直到函数执行结束。再回到之前的位置。这就是所谓的用同步的方式写异步的代码吧

但是,为啥在Task.Factory.StartNew才会体现出来,这个我就不清楚了,请各位大佬指点一下。

.Await();

最后,还有个:Task.Delay(3000).Await();

这个是prsim对Task写的的一个拓展方法(避免在主线程调用时,阻塞UI):

 

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到