前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C# 异步和同步的区别

C# 异步和同步的区别

作者头像
郑小超.
发布2021-02-04 10:35:45
1.3K0
发布2021-02-04 10:35:45
举报
文章被收录于专栏:GreenLeavesGreenLeaves

1、同步代码

代码语言:javascript
复制
class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine($"当前线程Id:{Thread.CurrentThread.ManagedThreadId}");
            var watch = Stopwatch.StartNew();
            CookRice();
            Console.WriteLine("饭煮好了");

            CookDish();
            Console.WriteLine("菜煮好了");

            DoLaundry();
            Console.WriteLine("衣服洗好了");
            watch.Stop();
            Console.WriteLine($"总耗时:{watch.ElapsedMilliseconds}毫秒");
            Console.WriteLine($"当前线程Id:{Thread.CurrentThread.ManagedThreadId}");
            Console.ReadKey();
        }

        /// <summary>
        /// 煮饭
        /// </summary>
        static void CookRice()
        {
            Console.WriteLine("开始煮饭");
            Task.Delay(3000).Wait();
        }

        /// <summary>
        /// 做菜
        /// </summary>
        static void CookDish()
        {
            Console.WriteLine("开始做菜");
            Task.Delay(2000).Wait();
        }

        /// <summary>
        /// 洗衣服
        /// </summary>
        static void DoLaundry()
        {
            Console.WriteLine("开始洗衣服");
            Task.Delay(3000).Wait();
        }
    }

标准的同步代码,Wait方法会阻塞当前现成的执行,知道之前的方法执行完毕.

2、异步代码

代码语言:javascript
复制
    class Program
    {
        static async Task Main(string[] args)
        {
            Console.WriteLine($"当前线程Id:{Thread.CurrentThread.ManagedThreadId}");
            var watch = Stopwatch.StartNew();
            await CookRice();
            Console.WriteLine("饭煮好了");

            await CookDish();
            Console.WriteLine("菜煮好了");

            await DoLaundry();
            Console.WriteLine("衣服洗好了");
            watch.Stop();
            Console.WriteLine($"总耗时:{watch.ElapsedMilliseconds}毫秒");
            Console.WriteLine($"当前线程Id:{Thread.CurrentThread.ManagedThreadId}");
            Console.ReadKey();
        }

        /// <summary>
        /// 煮饭
        /// </summary>
        static async Task CookRice()
        {
            Console.WriteLine("开始煮饭");
            await Task.Delay(3000);
        }

        /// <summary>
        /// 做菜
        /// </summary>
        static async Task CookDish()
        {
            Console.WriteLine("开始做菜");
            await Task.Delay(2000);
        }

        /// <summary>
        /// 洗衣服
        /// </summary>
        static async Task DoLaundry()
        {
            Console.WriteLine("开始洗衣服");
            await Task.Delay(3000);
        }
    }

3、简要分析

到这里发现同步和异步的程序执行时间是一样的,说明async 和 await下的异步编程执行看起来是"同步的",当然它的原理不是同步的,是"通知机制",具体自行百度.两者唯一的区别就是看似同步的异步代码,却被两个线程处理过了.这从侧面反映了异步代码能提升Cpu利用率,虽然执行时间没有改变.如果单单只有这点,那异步会显得比较鸡肋,接着看下面的例子,因为2中的代码没有启动异步的一些关键功能.

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-02-02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档