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秒