Task.ContinueWith()父任务不等待子任务完成

由于我在嵌套任务的上下文中理解了Task ,我真的不明白 – 为什么第二次打印之前的第3次打印?

即使我使用了Task.WaitAll(t) ,它Task.WaitAll(t)第二行之前打印第3行。

码:

 public static void Main() { Task t = new Task( () => { Thread.Sleep(2000); Console.WriteLine("1st print..."); }); t.ContinueWith( x => { Thread.Sleep(2000); Console.WriteLine("2nd print..."); }, TaskContinuationOptions.OnlyOnRanToCompletion); t.Start(); Task.WaitAll(t); Console.WriteLine("3rd print..."); Console.Read(); } 

输出:

在此处输入图像描述

你还需要等待延续:

 Task t2 = t.ContinueWith( /* .. */ ); Task.WaitAll(new [] { t, t2 } ); 

你只等待t ,而不是它的继续。 这就是为什么延续将在未来某个时间运行的原因。 如果它不适用于Console.Read它可能永远不会在进程退出之前运行。

Task.WaitAll(t)相当于t.Wait() (你应该使用它,因为它更惯用)。

让它等待所有延续(可能是递归)将导致不直观的行为并具有非局部效果。 程序的远程部分可能会影响您的代码。

你假设它应该等待子任务,但没有基础做出这样的假设。 来自MSDN:

Task.WaitAll:等待所有提供的Task对象完成执行。

它完全符合它的说法。 ContinueWith不会更改原始任务的长度,也不会变长。 它只是在之后执行。