专栏首页GreenLeavesC# 异步和同步的区别

C# 异步和同步的区别

1、同步代码

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、异步代码

    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中的代码没有启动异步的一些关键功能.

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 同步和异步的区别

    答案一: 1.异步传输 通常,异步传输是以字符为传输单位,每个字符都要附加 1 位起始位和 1 位停止位,以标记一个字符的开始和结束,并以此实现数据传输同步...

    哲洛不闹
  • 同步和异步的区别

    答案一: 1.异步传输 通常,异步传输是以字符为传输单位,每个字符都要附加 1 位起始位和 1 位停止位,以标记一个字符的开始和结束,并以此实现数据传输同步...

    哲洛不闹
  • 异步和同步的区别

    ”同步“就好比:你去外地上学(人生地不熟),突然生活费不够了;此时你决定打电话回家,通知家里转生活费过来,可是当你拨出电话时,对方一直处于待接听状态(即:打不通...

    kirin
  • 同步调用、回调和异步调用区别

    蛋未明
  • C线程同步/异步

    1 #include<windows.h> 2 #include<stdio.h> 3 #include<string.h> 4 //#include ...

    Gxjun
  • 传统同步阻塞和异步非阻塞的区别理解

    同步与异步的理解 同步与异步的重点在消息通知的方式上,也就是调用结果通知的方式。 同步:当一个同步调用发出去后,调用者要一直等待调用结果的通知后,才能进行后续...

    小勇DW3
  • C#:Func的同步、异步调用

    实际开发中,对于一些耗时较长的操作,我们往往会将其封装成异步方式调用,以加速系统响应或改善用户体验,下面是一个示例: 有一个现成的类MyMath,里面有一个Ad...

    菩提树下的杨过
  • 伺服电机,步进电机,同步电动机和异步电动机的区别

    同步电动机与异步电动机 原理: 同步电机就是靠励磁电流运行的,如果没有励磁,电机就是异步的。励磁是加在转子上的直流系统,它的旋转速度和极性与定子是一致的...

    机器人网
  • 【JavaWeb】95:同步和异步

    如果是同步请求,需要将信息填写完整,再发送请求,服务器响应填写是否正确,再做修改。

    刘小爱

扫码关注云+社区

领取腾讯云代金券