请看这段代码:
期望的输出是:
但我得到了:
这可能与 InnerTask 在不同的线程上执行有关。我使用 ContinueWith,因为原始代码中的任务是动态创建并以此方式排队的。使用 .Wait() 方法(见下文)可以工作,但我认为这是一个坏主意,因为该方法会阻塞。
这里的正确方法是什么?
private async Task InnerTask(bool outerTaskResult)
{
Console.WriteLine("2");
await Task.Factory.StartNew(() => Thread.Sleep(10000));
Console.WriteLine("3");
}
private async void Button2_Click(object sender, RoutedEventArgs e)
{
var task = Task.FromResult(false);
Task<Task> aggregatedTask = task.ContinueWith(task1 => InnerTask(task1.Result));
Console.WriteLine("1");
await aggregatedTask;
Console.WriteLine("4");
}
期望的输出是:
1
2
3
4
但我得到了:
1
2
4
3
这可能与 InnerTask 在不同的线程上执行有关。我使用 ContinueWith,因为原始代码中的任务是动态创建并以此方式排队的。使用 .Wait() 方法(见下文)可以工作,但我认为这是一个坏主意,因为该方法会阻塞。
task.ContinueWith(task1 => InnerTask(task1.Result).Wait())
这里的正确方法是什么?
await aggregatedTask
的返回值实际上是内部任务。 - Panagiotis Kanavosawait
两次。这两种方法都会做同样的事情。这当然是一种适当的方法。在C# 5.0中,您实际上可以将Unwrap
实现为:public static async Task Unwrap(this Task<Task> task){ await await task; }
(C# 4.0版本实际上非常冗长和乏味。) - Servy1
或2
以任意顺序发生。您的第二个代码片段强制执行严格的顺序。换句话说,它没有并行化OP并行化的一些操作,而他可能希望这两个操作能够并行进行。 - Servyawait task
之前(而不是在其右侧),以保持OP的原始语义。 - Servy