嘗試使用 C# (.Net6) 中的任務模擬泡茶。我的問題是我希望 BoilWater &(GetCup、InsertTeaBag 和 GetMilk)同步運行,然后在它們完成后運行其余的方法。我使用了 await 關鍵字,但沒有用。
我的代碼:
await MakeTea();
async Task MakeTea()
{
await Task.Run(() => {
Task.Run(() => BoilWater());
Task.Run(() =>
{
GetCup();
InsertTeabag();
GetMilk();
});
});
PourBoiledWater();
StirTeaBag();
PourMilk();
FinalStir();
}
async Task BoilWater()
{
Console.WriteLine("boiling water...");
Thread.Sleep(20000);
Console.WriteLine("finished boiling water!!!");
Console.WriteLine("-----------------------");
}
async Task InsertTeabag()
{
Console.WriteLine("taking out tea bag box out of cupboard and insert it into cup...");
Thread.Sleep(5000);
Console.WriteLine("finished inserting teabag!!!");
Console.WriteLine("-----------------------");
}
async Task GetCup()
{
Console.WriteLine("taking out tea cup out of cupboard...");
Thread.Sleep(2000);
Console.WriteLine("finished taking out cup!!!");
Console.WriteLine("-----------------------");
}
async Task GetMilk()
{
Console.WriteLine("taking out milk out of the fridge...");
Thread.Sleep(4000);
Console.WriteLine("finished taking getting milk!!!");
Console.WriteLine("-----------------------");
}
async Task PourMilk()
{
Console.WriteLine("pouring milk...");
Thread.Sleep(3000);
Console.WriteLine("finished pouring milk!!!");
Console.WriteLine("-----------------------");
}
async Task PourBoiledWater()
{
Console.WriteLine("pouring boiling water...");
Thread.Sleep(3000);
Console.WriteLine("finished pouring boiling water!!!");
Console.WriteLine("-----------------------");
}
async Task StirTeaBag()
{
Console.WriteLine("stirring teabag with boiled water...");
Thread.Sleep(9000);
Console.WriteLine("finihsed stirring!!!");
Console.WriteLine("-----------------------");
}
async Task FinalStir()
{
Console.WriteLine("stirring milk into tea...");
Thread.Sleep(2000);
Console.WriteLine("finished stirring!!!");
Console.WriteLine("-----------------------");
}
預先感謝您的幫助。
輸出:

uj5u.com熱心網友回復:
await總是關于在每個級別上鏈接異步。一起使用async和await。你以錯誤的方式鏈接它
await Task.Run(() => { // returned task only start other tasks and don't wait for their end.
Task.Run(() => BoilWater());
Task.Run(() =>
{
GetCup();
InsertTeabag();
GetMilk();
});
});
你需要一種:
var boilTask = Task.Run(async () => await BoilWater());
var otherPreparationsTask = Task.Run(async () =>
{
await GetCup();
await InsertTeabag();
await GetMilk();
}); // you will get only one task for all this nethods. After all of them get completed consequently
await Task.WhenAll(new[] {boilTask, otherPreparationsTask});
并且您不得將Sleep與async關鍵字一起使用。你必須使用
await Task.Delay(...)
這是我的輸出和源代碼:
boiling water...
taking out tea cup out of cupboard...
finished taking out cup!!!
-----------------------
taking out tea bag box out of cupboard and insert it into cup...
finished inserting teabag!!!
-----------------------
taking out milk out of the fridge...
finished taking getting milk!!!
-----------------------
finished boiling water!!!
-----------------------
pouring boiling water...
finished pouring boiling water!!!
-----------------------
stirring teabag with boiled water...
finihsed stirring!!!
-----------------------
pouring milk...
finished pouring milk!!!
-----------------------
stirring milk into tea...
finished stirring!!!
-----------------------
await MakeTea();
async Task MakeTea()
{
var boilTask = Task.Run(async () => await BoilWater());
var otherTasks = Task.Run(async () =>
{
await GetCup();
await InsertTeabag();
await GetMilk();
});
await Task.WhenAll(new[] {boilTask, otherTasks});
await PourBoiledWater();
await StirTeaBag();
await PourMilk();
await FinalStir();
}
async Task BoilWater()
{
Console.WriteLine("boiling water...");
await Task.Delay(20000);
Console.WriteLine("finished boiling water!!!");
Console.WriteLine("-----------------------");
}
async Task InsertTeabag()
{
Console.WriteLine("taking out tea bag box out of cupboard and insert it into cup...");
await Task.Delay(5000);
Console.WriteLine("finished inserting teabag!!!");
Console.WriteLine("-----------------------");
}
async Task GetCup()
{
Console.WriteLine("taking out tea cup out of cupboard...");
await Task.Delay(2000);
Console.WriteLine("finished taking out cup!!!");
Console.WriteLine("-----------------------");
}
async Task GetMilk()
{
Console.WriteLine("taking out milk out of the fridge...");
await Task.Delay(4000);
Console.WriteLine("finished taking getting milk!!!");
Console.WriteLine("-----------------------");
}
async Task PourMilk()
{
Console.WriteLine("pouring milk...");
await Task.Delay(3000);
Console.WriteLine("finished pouring milk!!!");
Console.WriteLine("-----------------------");
}
async Task PourBoiledWater()
{
Console.WriteLine("pouring boiling water...");
await Task.Delay(3000);
Console.WriteLine("finished pouring boiling water!!!");
Console.WriteLine("-----------------------");
}
async Task StirTeaBag()
{
Console.WriteLine("stirring teabag with boiled water...");
await Task.Delay(9000);
Console.WriteLine("finihsed stirring!!!");
Console.WriteLine("-----------------------");
}
async Task FinalStir()
{
Console.WriteLine("stirring milk into tea...");
await Task.Delay(2000);
Console.WriteLine("finished stirring!!!");
Console.WriteLine("-----------------------");
}
uj5u.com熱心網友回復:
使用await Task.Delay(int)而不是Thread.Sleep(int)
另外,您還沒有為 t1 和 t2 執行全部等待。一旦 t1 和 t2 完成,那么您必須執行另一個任務,因此您需要使用 WhenAll() 或 WaitAll() 等待;
await MakeTea();
async Task MakeTea()
{
await Task.Run(async () => {
Task t1= Task.Run(async() => await BoilWater());
Task t2= Task.Run(async() =>
{
await GetCup();
await InsertTeabag();
await GetMilk();
});
await Task.WhenAll(t1,t2);
});
await PourBoiledWater();
await StirTeaBag();
await PourMilk();
await FinalStir();
}
async Task BoilWater()
{
Console.WriteLine("boiling water...");
await Task.Delay(20000);
Console.WriteLine("finished boiling water!!!");
Console.WriteLine("-----------------------");
}
async Task InsertTeabag()
{
Console.WriteLine("taking out tea bag box out of cupboard and insert it into cup...");
await Task.Delay(5000);
Console.WriteLine("finished inserting teabag!!!");
Console.WriteLine("-----------------------");
}
async Task GetCup()
{
Console.WriteLine("taking out tea cup out of cupboard...");
await Task.Delay(2000);
Console.WriteLine("finished taking out cup!!!");
Console.WriteLine("-----------------------");
}
async Task GetMilk()
{
Console.WriteLine("taking out milk out of the fridge...");
await Task.Delay(4000);
Console.WriteLine("finished taking getting milk!!!");
Console.WriteLine("-----------------------");
}
async Task PourMilk()
{
Console.WriteLine("pouring milk...");
await Task.Delay(3000);
Console.WriteLine("finished pouring milk!!!");
Console.WriteLine("-----------------------");
}
async Task PourBoiledWater()
{
Console.WriteLine("pouring boiling water...");
await Task.Delay(3000);
Console.WriteLine("finished pouring boiling water!!!");
Console.WriteLine("-----------------------");
}
async Task StirTeaBag()
{
Console.WriteLine("stirring teabag with boiled water...");
await Task.Delay(9000);
Console.WriteLine("finihsed stirring!!!");
Console.WriteLine("-----------------------");
}
async Task FinalStir()
{
Console.WriteLine("stirring milk into tea...");
await Task.Delay(2000);
Console.WriteLine("finished stirring!!!");
Console.WriteLine("-----------------------");
}
uj5u.com熱心網友回復:
Thread.Sleep(9000)這是為了使忙等待(阻塞執行緒)使用異步方法,您應該呼叫await Task.Delay(9000)insted- 每當您
async在方法中使用時,方法體都應包含await關鍵字
await MakeTea();
async Task MakeTea()
{
var BoilerTask = BoilWater();
await GetCup();
await InsertTeabag();
await GetMilk();
await BoilerTask;
await PourBoiledWater();
await StirTeaBag();
await PourMilk();
await FinalStir();
}
async Task BoilWater()
{
Console.WriteLine("boiling water...");
await Task.Delay(20000);
Console.WriteLine("finished boiling water!!!");
Console.WriteLine("-----------------------");
}
async Task InsertTeabag()
{
Console.WriteLine("taking out tea bag box out of cupboard and insert it into cup...");
await Task.Delay(5000);
Console.WriteLine("finished inserting teabag!!!");
Console.WriteLine("-----------------------");
}
async Task GetCup()
{
Console.WriteLine("taking out tea cup out of cupboard...");
await Task.Delay(2000);
Console.WriteLine("finished taking out cup!!!");
Console.WriteLine("-----------------------");
}
async Task GetMilk()
{
Console.WriteLine("taking out milk out of the fridge...");
await Task.Delay(4000);
Console.WriteLine("finished taking getting milk!!!");
Console.WriteLine("-----------------------");
}
async Task PourMilk()
{
Console.WriteLine("pouring milk...");
await Task.Delay(3000);
Console.WriteLine("finished pouring milk!!!");
Console.WriteLine("-----------------------");
}
async Task PourBoiledWater()
{
Console.WriteLine("pouring boiling water...");
await Task.Delay(3000);
Console.WriteLine("finished pouring boiling water!!!");
Console.WriteLine("-----------------------");
}
async Task StirTeaBag()
{
Console.WriteLine("stirring teabag with boiled water...");
await Task.Delay(9000);
Console.WriteLine("finihsed stirring!!!");
Console.WriteLine("-----------------------");
}
async Task FinalStir()
{
Console.WriteLine("stirring milk into tea...");
await Task.Delay(2000);
Console.WriteLine("finished stirring!!!");
Console.WriteLine("-----------------------");
}
如果你喜歡準備一份完整的早餐,這里是微軟的一個又好又快的食譜??
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/385160.html
