• 理解C#异步编程


    async和await是C# 5.0新增加的关键字,提高了异步编程的易用性,请看以下示例:

    using System;
    using System.Diagnostics;
    using System.Threading;
    using System.Threading.Tasks;
    
    namespace ConsoleApp
    {
        class Program
        {
            static void Main(string[] args)
            {
                MakeBreakfast01();
                //MakeBreakfast02();
                //MakeBreakfast03();
                Console.ReadLine();
            }
    
            // 新手来了,烤面包、煎蛋、煎肉一样一样做
            public static async void MakeBreakfast01()
            {            
                Console.WriteLine("开始做早餐");
                Stopwatch watch = Stopwatch.StartNew();
                await ToastBreadAsync();
                await FryEggsAsync();
                await FryBaconAsync();
                watch.Stop();
                Console.WriteLine($"做早餐完成,耗时{watch.Elapsed.Seconds}秒");
            }
    
            // 有一个面包机和一个锅,煎蛋、煎肉先后进行,烤面包同时进行
            public static async void MakeBreakfast02()
            {            
                Console.WriteLine("开始做早餐");
                Stopwatch watch = Stopwatch.StartNew();
                var taskToastBread = ToastBreadAsync();
                var taskFryEggsAndBacon = Task.Run(async () =>
                {
                    await FryEggsAsync();
                    await FryBaconAsync();
                });            
                await Task.WhenAll(taskToastBread, taskFryEggsAndBacon);
                watch.Stop();
                Console.WriteLine($"做早餐完成,耗时{watch.Elapsed.Seconds}秒");
            }
    
            // 有一个面包机和两个锅,烤面包、煎蛋、煎肉三项同时进行
            public static async void MakeBreakfast03()
            {            
                Console.WriteLine("开始做早餐");
                Stopwatch watch = Stopwatch.StartNew();
                var taskToastBread = ToastBreadAsync();
                var taskFryEggs = FryEggsAsync();
                var taskFryBacon = FryBaconAsync();            
                await Task.WhenAll(taskToastBread, taskFryEggs, taskFryBacon);
                watch.Stop();
                Console.WriteLine($"做早餐完成,耗时{watch.Elapsed.Seconds}秒");
            }
    
            // 煎蛋
            public static async Task FryEggsAsync()
            {
                Console.WriteLine("开始煎蛋");
                await Task.Delay(1000);
                Console.WriteLine("煎蛋完成");
            }
    
            // 煎肉
            public static async Task FryBaconAsync()
            {
                Console.WriteLine("开始煎肉");
                await Task.Delay(1000);
                Console.WriteLine("煎肉完成");
            }
    
            // 烤面包
            public static async Task ToastBreadAsync()
            {
                Console.WriteLine("开始烤面包");
                await Task.Delay(1000);
                Console.WriteLine("烤面包完成");
            }
        }
    }
    MakeBreakfast01 执行结果:
    开始做早餐
    开始烤面包
    烤面包完成
    开始煎蛋
    煎蛋完成
    开始煎肉
    煎肉完成
    做早餐完成,耗时3秒
    MakeBreakfast02 执行结果:
    开始做早餐
    开始烤面包
    开始煎蛋
    煎蛋完成
    烤面包完成
    开始煎肉
    煎肉完成
    做早餐完成,耗时2秒
    MakeBreakfast03 执行结果:
    开始做早餐
    开始烤面包
    开始煎蛋
    开始煎肉
    煎肉完成
    烤面包完成
    煎蛋完成
    做早餐完成,耗时1秒
     
  • 相关阅读:
    Java 线程池
    Java 内存模型
    img图片铺满父元素
    element-ui 表单复杂数据类型校验
    element-ui 栅格布局 一行五等分
    element-ui表单只验证单个字段
    记录
    js-字符串全局替换
    vue3-搭建项目-vue2-vu3使用上的变化
    小程序引入echarts
  • 原文地址:https://www.cnblogs.com/lgyup/p/16191056.html
Copyright © 2020-2023  润新知