zoukankan      html  css  js  c++  java
  • C# async await 举个栗子

    首先,async 和 await 代表异步执行和等待。

    async是一个标记,告诉编译器,我可能是一个异步方法。

    await 代表等待,告诉编译器,这里等我返回结果。

    下面,我们简单说一下。

    一 , 首先我们看一下普通程序

    static void Main(string[] args)
            {
                Stopwatch sw = new Stopwatch();
                sw.Start();
     
                MyTest();
                Thread.Sleep(5000);
                Console.WriteLine("Completed");
     
                sw.Stop();
                Console.WriteLine(sw.Elapsed.Seconds);
                Console.ReadKey();
            }
     
            public static void MyTest()
            {
                Test1();
            }
     
            public static void Test1()
            {
                Thread.Sleep(5000);
                Console.WriteLine("Test1");
            }

    查看结果:

    结论:

    由于Main()和MyTest()都存在 Thread.Sleep(5000),所以总共耗时10秒。

    二 ,下面使用await / async

    static void Main(string[] args)
            {
                Stopwatch sw = new Stopwatch();
                sw.Start();
     
                MyTest();
                Thread.Sleep(5000);
                Console.WriteLine("Completed");
     
                sw.Stop();
                Console.WriteLine("耗时:"+sw.Elapsed.Seconds);
                Console.ReadKey();
            }
     
            public static async void MyTest()
            {
                await Test1();
            }
     
            public async static Task Test1()
            {
                await Task.Delay(5000);
                Console.WriteLine("Test1");
            }

    查看结果:

    结论:

    运气不错,运行了2次。

    因为Task异步处理,所以出现了不太一样的结果。

    通过我们这个看出来主线程在5秒就结束了,而线程也在5秒左右结束了。

    三 , 最后来个彩蛋,疏导和理解一下运行

    static void Main(string[] args)
            {
                Stopwatch sw = new Stopwatch();
                sw.Start();
     
                MyTest();
                Thread.Sleep(3000);
                Console.WriteLine("Completed");
     
                sw.Stop();
                Console.WriteLine("耗时:"+sw.Elapsed.Seconds);
                Console.ReadKey();
            }
     
     
            public static async void MyTest()
            {
                var q = Test1();
                Console.WriteLine("==============");
                var q1 = Test2();
                Console.WriteLine(await q);
                Console.WriteLine(await q1);
            }
     
     
     
            public static async Task<string> Test1()
            {
                await Task.Delay(5000);
                return "12333";
            }
     
            public static async Task<string> Test2()
            {
                await Task.Delay(3000);
                return "hello";
            }

    查看结果:

     

    结论:

    主程序运行

    1 找到MyTest的"==========",输出了,

    2 这个时候由于MyTest中q和q1在等待返回,

    主程序继续执行下去,输出了"Completed"

    3 这里很好理解,输出"耗时:3"

    4 为什么把他们都设置为步骤4???因为await阻塞了主程序,在等待返回。

    可是!虽然Test1耗时5秒,而Test2耗时3秒。但Test2还是要等待Test1完成才能输出,因为主程序因为await阻塞了

    (如果你把Test1改成1秒,效果就明显了。)




  • 相关阅读:
    MSDN Visual系列:在SharePoint开发环境中配置CAML语法的智能感知
    学习SharePoint你需要什么?
    MSDN Visual系列:用WSSv3中的SPGridView控件来显示数据
    关于DataFormWebPart中CreatedModifiedInfo信息的分开使用
    MSDN Visual系列:在WSSv3中编程方式激活单个文档库的审核功能
    MOSS 2007基础:部署自定义WebPart
    MSDN Visual系列:编程激活SharePoint网站集的审计功能
    升级SharePoint数据库到SQL Server 2005的一点心得
    一个集WF/WCF/Silverlight/SharePoint技术于一身的东西
    MSDN Visual系列:WSSv3之权限提升
  • 原文地址:https://www.cnblogs.com/hanjun0612/p/11103699.html
Copyright © 2011-2022 走看看