看一下这段代码:
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())
这里正确的方法是什么?
您可以使用TaskExtensions.Unwrap()
(是的扩展方法Task<Task>
)解开外部任务并检索内部任务:
private async void Button2_Click(object sender, RoutedEventArgs e)
{
var task = Task.FromResult(false);
Task aggregatedTask = task.ContinueWith(task1 => InnerTask(task1.Result)).Unwrap();
Console.WriteLine("1");
await aggregatedTask;
Console.WriteLine("4");
}
请注意,为简化整个过程,ContinueWith
您可以await
执行任务,而不是延续样式:
private async void Button2_Click(object sender, RoutedEventArgs e)
{
var task = Task.FromResult(false);
Console.WriteLine("1");
var result = await task;
await InnerTask(result);
Console.WriteLine("4");
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句