【问题标题】:Await Task.WhenAll() inside task not awaitingAwait Task.WhenAll() 内部任务不等待
【发布时间】:2012-11-06 02:08:15
【问题描述】:

我的问题是,当一个任务有一个 Task.WhenAll() 调用(运行其他任务)时,WhenAll() 行使消费代码继续执行,这与我所期望的不同。因此,以下代码在 Task.WhenAll() 被命中时立即输出“finished”,而不是在其参数中的所有任务都完成之后。

    // Just a simple async method
    public Task DoWorkAsync()
    {
        return Task.Factory.StartNew(
            () =>
            {
                // Working
            });
    }

    // This one used the previous one with Task.WhenAll()
    public Task DoLoadsOfWorkAsync()
    {
        return Task.Factory.StartNew(
            async () =>
            {
                // Working
                // This line makes the task return immediately
                await Task.WhenAll(DoWorkAsync(), DoWorkAsync());
                // Working
            });
    }

    // Consuming code
    await DoLoadsOfWorkAsync();
    Console.WriteLine("finished");

我希望在执行 DoLoadsOfWorkAsync() 的最后一行时调用 WriteLine()。

我做错了什么?提前致谢。

【问题讨论】:

    标签: c# task-parallel-library async-await


    【解决方案1】:

    Task.WhenAll 立即返回一个新的Task,它不会阻塞。当传递给WhenAll 的所有任务都完成后,返回的任务将完成。

    它是一个异步等价于Task.WaitAll,如果你想阻塞,这是使用的方法。

    但是,您还有另一个问题。使用Task.Factory.StartNew 并传递async 委托似乎会导致Task<Task> 类型,其中外部任务在内部任务开始执行时完成(而不是在完成时)。

    使用较新的Task.Run 可以避免这种情况。

    【讨论】:

    • 你搞定了:问题是任务,我忽略了它。顺便说一句,我不希望线程阻塞,只是在前面的任务完成后继续执行。这就是为什么我使用 Task.WhenAll() 而不是 wait 和 aync-await 构造。非常感谢您的帮助!
    • 如果您想了解Task.Run 及其所有优点(以及它为什么以及如何做到这一点),请访问:blogs.msdn.com/b/pfxteam/archive/2011/10/24/10229468.aspx
    猜你喜欢
    • 2016-01-30
    • 2021-07-17
    • 1970-01-01
    • 2021-01-26
    • 2016-08-22
    • 2023-03-26
    • 2017-09-24
    • 2018-01-11
    • 1970-01-01
    相关资源
    最近更新 更多