C# 异步和同步的区别

2021-02-04 10:35:45 浏览数 (2)

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

0 人点赞