這個問題在這里已經有了答案: 為什么這個任務掛起? (2 個回答) 任務的執行在 C# 中使用 Task.WaitAll 掛起 (2 個回答) 3 天前關閉。
我不明白為什么從控制臺應用程式的 Main 方法呼叫異步方法會永遠掛起。我覺得我缺少異步執行的一些關鍵元素:
static void Main(string[] args)
{
Console.WriteLine("w3");
var exe = new Exe2();
exe.Do2().Wait();
Console.WriteLine("/w3");
Console.ReadKey();
}
public class Exe2
{
public async Task Do2()
{
Task task1 = new Task(() => { Console.WriteLine("t1"); Task.Delay(2000); });
Task task2 = new Task(() => { Console.WriteLine("t2"); Task.Delay(2000); });
Task task3 = new Task(() => { Console.WriteLine("t3"); Task.Delay(2000); });
await Task.WhenAll(task1, task2, task3);
}
}
上面的代碼列印 w3 不是別的,也沒有ReadKey。
uj5u.com熱心網友回復:
你還沒有開始你的任務,Task.WhenAll基本上是要永遠等待。你需要打電話Start
啟動任務,將其調度到當前的 TaskScheduler 執行。
task1.Start();
task2.Start();
task3.Start();
await Task.WhenAll(task1, task2, task3);
但是:除非你絕對知道你需要它,否則永遠不要使用Task建構式,它有幾個非常大的陷阱對于沒有經驗的編碼人員來說,例如只支持動作委托和需要啟動。相反,總是使用Task.Runwhich 將啟動您的任務熱
Task task1 = Task.Run(() => { Console.WriteLine("t1"); Task.Delay(2000); });
Task task2 = Task.Run(() => { Console.WriteLine("t2"); Task.Delay(2000); });
Task task3 = Task.Run(() => { Console.WriteLine("t3"); Task.Delay(2000); });
雖然不是您的問題,但您永遠不需要在現代 .net 中呼叫Wait或,甚至在異步方法上更是如此。相反,使用異步多載Result Main
static async Task Main(string[] args)
{
Console.WriteLine("w3");
var exe = new Exe2();
await exe.Do2();
Console.WriteLine("/w3");
Console.ReadKey();
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/318775.html
