using System.Threading.Tasks;
using System.Diagnostics;
private static readonly SemaphoreSlim fryPans = new SemaphoreSlim(3, 3);
static async Task Main(string[] args)
Console.OutputEncoding = System.Text.Encoding.UTF8;
Stopwatch sw = new Stopwatch();
Coffee cup = PourCoffee();
Console.WriteLine("主线程ID: {0}", Thread.CurrentThread.ManagedThreadId);
Console.WriteLine("1.咖啡准备完毕");
Console.WriteLine("线程 {0} 停止使用煎锅;煎锅总数: {1}.", Task.CurrentId, fryPans.CurrentCount);
Task<Egg> eggsTask = FryEggsAsync(2);
Task<Bacon> baconTask = FryBaconAsync(3);
Task<Toast> toastTask = ToastBreadAsync(2);
Egg eggs = await eggsTask;
Console.WriteLine("主线程ID: {0}", Thread.CurrentThread.ManagedThreadId);
Console.WriteLine("2.鸡蛋准备完毕");
Bacon bacon = await baconTask;
Console.WriteLine("主线程ID: {0}", Thread.CurrentThread.ManagedThreadId);
Console.WriteLine("3.培根准备完毕");
Toast toast = await toastTask;
Console.WriteLine("面包线程ID: {0}", Thread.CurrentThread.ManagedThreadId);
Console.WriteLine("4.面包准备完毕");
Console.WriteLine("5.橙汁准备完毕");
Console.WriteLine("主线程ID: {0}", Thread.CurrentThread.ManagedThreadId);
Console.WriteLine(">_< 早餐准备完毕!");
TimeSpan ts = sw.Elapsed;
long times = sw.ElapsedMilliseconds;
Console.WriteLine($"总用时{times}");
private static Juice PourOJ()
Console.WriteLine("倒橙汁");
private static void ApplyJam(Toast toast) => Console.WriteLine("给面包刷果酱");
private static void ApplyButter(Toast toast) => Console.WriteLine("给面包加黄油");
private static async Task<Toast> ToastBreadAsync(int slices)
return await Task.Run(() =>
Console.WriteLine("烤面包线程ID: {0}", Thread.CurrentThread.ManagedThreadId);
Console.WriteLine("线程 {0} 使用煎锅;煎锅总数: {1}.", Task.CurrentId, fryPans.CurrentCount);
for (int slice = 0; slice < slices; slice++)
Console.WriteLine("将一片面包放到烤面包机");
Console.WriteLine("开始烤面包");
Console.WriteLine("烤面包完成");
private static async Task<Bacon> FryBaconAsync(int slices)
return await Task.Run(() =>
Console.WriteLine("煎培根线程ID: {0}", Thread.CurrentThread.ManagedThreadId);
Console.WriteLine("线程 {0} 使用煎锅;煎锅总数: {1}.", Task.CurrentId, fryPans.CurrentCount);
Console.WriteLine($"将{slices}片培根放到煎锅");
Console.WriteLine("煎培根第一面");
for (int slice = 0; slice < slices; slice++)
Console.WriteLine("给培根翻面");
Console.WriteLine("煎培根第二面");
Console.WriteLine("将培根放到盘子");
private static async Task<Egg> FryEggsAsync(int howMany)
return await Task.Run(() =>
Console.WriteLine("煎蛋线程ID: {0}", Thread.CurrentThread.ManagedThreadId);
Console.WriteLine("线程 {0} 使用煎锅;煎锅总数: {1}.", Task.CurrentId, fryPans.CurrentCount);
Console.WriteLine("加热煎蛋锅");
Console.WriteLine($"打碎{howMany}个蛋");
Console.WriteLine("煎蛋中 ...");
Console.WriteLine("将煎蛋放到盘子");
private static Coffee PourCoffee()
Console.WriteLine("冲咖啡");