如何等待直到Task.ContinueWith内部任务完成

安德烈·吉斯(Andrzej Gis)

看一下这段代码:

    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())

这里正确的方法是什么?

尤瓦尔·伊茨恰科夫(Yuval Itzchakov)

您可以使用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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章