理解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秒
 

 

posted @ 2022-04-25 17:01  广阔之海  阅读(79)  评论(0)    收藏  举报