我有以下最少的代码:
class Program
{
static async Task T1()
{
await Task.Delay(1000);
Console.WriteLine("T1");
}
static async Task T2()
{
await Task.Delay(500);
Console.WriteLine("T2");
}
static async Task Test()
{
var firstTask = T1();
var secondTask = firstTask.ContinueWith(async (t) => await T2());
await secondTask;
}
static void Main(string[] args)
{
Task.Run(async () => { await Test(); }).GetAwaiter().GetResult();
Console.WriteLine("End");
Console.ReadLine();
}
}
我很遗憾Test方法将等待T2完成,但是得到了以下结果
T1
End
T2
为什么?
答案 0 :(得分:3)
您正在寻找的是Unwrap
方法。
如果您查看secondTask
的类型,您会发现它实际上是Task<Task>
,因此,在等待外部任务时,内部任务不会阻塞。嵌套异步调用时处理此问题的方法如下:
var secondTask = firstTask.ContinueWith(async (t) => await T2()).Unwrap();
secondTask
现在的类型为Task
,您应该看到预期的行为。