【问题标题】:What's the difference between `WhenAll(TaskList)` and `WhenAll(TaskList).Wait()`? [duplicate]`WhenAll(TaskList)` 和 `WhenAll(TaskList).Wait()` 有什么区别? [复制]
【发布时间】:2021-04-06 14:53:13
【问题描述】:

比如有什么区别

        Task<DataSet> DBTask = Task.Run (() => DBHelper.DbTest ());
        Task<Boolean> CheckTimeTask = Task.Run (() => Module.CheckTime ());
        Task.WhenAll (DBTask, CheckTimeTask); // <-- no wait?
        if (!CheckTimeTask.Result || DBTask.Result == null)
        {
            Close ();
        }   

        Task<DataSet> DBTask = Task.Run (() => DBHelper.DbTest ());
        Task<Boolean> CheckTimeTask = Task.Run (() => Module.CheckTime ());
        Task.WhenAll (DBTask, CheckTimeTask).Wait (); // <-- wait ?
        if (!CheckTimeTask.Result || DBTask.Result == null)
        {
            Close ();
        }  

似乎两者都在等待返回结果?我无法弄清楚差异,那么哪个更好?

【问题讨论】:

  • 如前所述,您的问题没有任何意义,因为Task.WhenAll() 除了返回一个代表所有Task 对象异步完成的Task 对象之外,什么都不做传递给它。您的代码丢弃了返回的Task 对象,这意味着Task 仍然未被观察到并且对程序没有任何影响。一个正确编写的程序会在该语句上使用await,并且副本准确地解释了它与使用Wait() 之间的区别。

标签: c# multithreading async-await task wait


【解决方案1】:

Task.WhenAll 是一个异步函数,它返回一个新任务,一旦所有后续任务完成,该任务就会完成。

Task.WhenAll().Wait 实际上会等待所有后续任务完成,然后再转到下一行代码。

在您的示例中,我确信您遇到了两个示例都产生相同调试结果的竞争条件。但是,Task.WhenAll 本身没有 .Wait 实际上是异步的,如果后续任务尚未完成,则不会停止进一步的代码执行。

这里是一些额外的信息链接:

【讨论】:

    猜你喜欢
    • 2014-12-21
    • 2023-04-03
    • 1970-01-01
    • 2014-09-27
    • 2011-09-01
    • 1970-01-01
    • 2012-03-20
    相关资源
    最近更新 更多