繁体   English   中英

等待任务中的Task.WhenAll()未等待

[英]Await Task.WhenAll() inside task not awaiting

我的问题是,当一个Task有一个Task.WhenAll()调用(运行其他Tasks)时,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()。

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

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

它与Task.WaitAll异步等效,并且这是您要阻止的方法。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM