等待ContinueWith结果不等待任务完成

时间:2018-12-12 17:30:43

标签: c# asynchronous

我有以下最少的代码:

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

为什么?

1 个答案:

答案 0 :(得分:3)

您正在寻找的是Unwrap方法。

如果您查看secondTask的类型,您会发现它实际上是Task<Task>,因此,在等待外部任务时,内部任务不会阻塞。嵌套异步调用时处理此问题的方法如下:

var secondTask = firstTask.ContinueWith(async (t) => await T2()).Unwrap();

secondTask现在的类型为Task,您应该看到预期的行为。