我試著閱讀了一些微軟的支持,但我想把它簡單地記錄下來,因為我發現其中大部分內容都令人困惑。我不明白為什么該方法的剩余部分會被執行?看起來它一碰到等待就會跳出,然后不再回傳,為什么它不回來并從它離開的地方開始?我試圖讓程式在咖啡等待時跳出,并在雞蛋上啟動,以便讓它們異步地執行。希望得到任何幫助--謝謝。
class Program<
{
static async Task Main(string[] args)。
{
Stopwatch stopWatch = new Stopwatch();
任務<咖啡> coffeeTask = MakeCoffeeAsync(stopWatch);
任務<雞蛋> eggTask = FryEggs(2);
stopWatch.Stop()。
TimeSpan ts = stopWatch.Elapsed;
string elapsedTime = String.Format("{0:00}", ts.Seconds) 。
Console.WriteLine("做早餐的時間。" elapsedTime " seconds")。)
}
private static async Task< Egg> FryEggs(int howMany)?
{
Console.WriteLine("Warming the egg pan..." )。
await Task.Delay(3000)。
Console.WriteLine($"破解{howMany}雞蛋")。
Console.WriteLine("煮雞蛋...")。
// await Task.Delay(8000);
Console.WriteLine("把雞蛋放在盤子里")。
Console.WriteLine("雞蛋已準備好")。
return new Egg()。
}
private static async Task< Coffee> MakeCoffeeAsync(Stopwatch timerstart)?
{
timerstart.Start()。
Console.WriteLine("Turning on machine")。
Console.WriteLine("等待機器就緒")。
await Task.Delay(5000)。
Console.WriteLine("獲取杯子")。
// await Task.Delay(4000);
Console.WriteLine("稱重的豆子")。
Console.WriteLine("搗碎咖啡")。
// await Task.Delay(8000);
Console.WriteLine("將咖啡倒入杯子")。
Console.WriteLine("咖啡準備好了" "
")。)
return new Coffee()。
}
}
class Egg { }
class Coffee { }
這是輸出:
等待on machine to be ready
暖和的蛋鍋...
是時候做早餐了。00秒
uj5u.com熱心網友回復:
你可以等待所有的任務被執行:
await Task.WhenAll(eggTask, coffeeTask);
static async 任務 Main(string[] args)
{
Stopwatch stopWatch = new Stopwatch();
任務<咖啡> coffeeTask = MakeCoffeeAsync(stopWatch);
任務<雞蛋> eggTask = FryEggs(2);
await Task.WhenAll(eggTask, coffeeTask);//注意這個。
stopWatch.Stop()。
TimeSpan ts = stopWatch.Elapsed;
string elapsedTime = String.Format("{0:00}"/span>, ts.Seconds);
Console.WriteLine("做早餐的時間。" elapsedTime " seconds")。)
}
另一個選項是添加await關鍵字:
static async 任務 Main(string[] args)
{
Stopwatch stopWatch = new Stopwatch()。
Coffee CoffeeTask = await MakeCoffeeAsync(stopWatch);
EggTask = await FryEggs(2) 。
stopWatch.Stop()。
TimeSpan ts = stopWatch.Elapsed;
string elapsedTime = String.Format("{0:00}"/span>, ts.Seconds);
Console.WriteLine("做早餐的時間。" elapsedTime " seconds")。)
}
uj5u.com熱心網友回復:
異步方法回傳一個任務,它可以有不同的狀態:任務可能仍在運行,也可能已經完成。如果你添加一個await,程式將等待,直到任務完成。因為你沒有一個await,所以你的程式不會等待到你的早餐完成。
static async 任務 Main(string[] args)
{
Stopwatch stopWatch = new Stopwatch();
任務<咖啡> coffeeTask = MakeCoffeeAsync(stopWatch);
任務<雞蛋> eggTask = FryEggs(2)。
Coffee cofee = await cofeeTask;
Egg egg = await eggTask;
stopWatch.Stop()。
TimeSpan ts = stopWatch.Elapsed;
string elapsedTime = String.Format("{0:00}"/span>, ts.Seconds);
Console.WriteLine("做早餐的時間。" elapsedTime " seconds")。)
}
uj5u.com熱心網友回復:
你正在解雇/遺忘你的任務。你應該等待它們,以避免在完成執行之前退出程式:
static async 任務 Main(string[] args)
{
Stopwatch stopWatch = new Stopwatch();
任務<咖啡> coffeeTask = MakeCoffeeAsync(stopWatch);
任務<雞蛋> eggTask = FryEggs(2)。
咖啡 coffee = await coffeeTask;
Egg egg = await eggTask;
stopWatch.Stop()。
TimeSpan ts = stopWatch.Elapsed;
string elapsedTime = String.Format("{0:00}"/span>, ts.Seconds);
Console.WriteLine("做早餐的時間。" elapsedTime " seconds")。)
}
uj5u.com熱心網友回復:
你的流程之所以沒有回傳,是因為你沒有等待函式FryEggs和MakeCoffeeAsync。
await是一個關鍵字,它告訴你的代碼在這里停止,直到它有結果。
如果您想同時制作咖啡和雞蛋,您需要 await FryEggs.
如果你想先做咖啡,然后再做雞蛋,你要awaitFryEggs和MakeCoffeeAsync
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/318023.html
標籤:
