private static async Task Main()
{
Console.Clear();
Console.WriteLine("start");
await MyMethodAsync();
}
private static async Task MyMethodAsync()
{
const int count = 10;
Task<string> loopATask = Task.Run(() => LoopA(count));
Task<string> loopBTask = Task.Run(() => LoopB(count));
string resultA = await loopATask;
string resultB = await loopBTask;
Console.WriteLine(resultA + resultB);
}
public static string LoopA(int count)
{
Task.Delay(2000);
return "LoopA has finished ";
}
public static string LoopB(int count)
{
Task.Delay(1000);
return "LoopB has finished ";
}
预期输出:写入结果A+结果B 前延迟2秒
实际输出:resulA+resultB立即打印
Task.Delay
是一个应该等待的异步操作:
创建一个将在一段时间后完成的任务。
所以,如果你不等待,它基本上就是一个未被观察到的结果。
将相应的方法更改为:
public static async Task<string> LoopA(int count)
{
await Task.Delay(2000);
return "LoopA has finished ";
}
public static Task<string> LoopB(int count)
{
await Task.Delay(1000);
return "LoopB has finished ";
}
现在,您也可以根据需要报废Task.Run
:
Task<string> loopATask = LoopA(count);
Task<string> loopBTask = LoopB(count);
还要注意,使用Task.WhenAll
比使用多个顺序await
有优势。