`WhenAll(TaskList)` 和 `WhenAll(TaskList).Wait()` 有什么区别?
What's the difference between `WhenAll(TaskList)` and `WhenAll(TaskList).Wait()`?
比如
有什么区别
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 是一个异步函数,它 returns 一个新任务,它将在所有后续任务完成后完成。
Task.WhenAll().Wait实际上是在等待所有后续任务完成后才转到下一行代码。
在您的示例中,我确定您遇到了竞争条件,即两个示例都产生了相同的调试结果。但是, Task.WhenAll 本身没有 .Wait 实际上是异步的,如果后续任务尚未完成,将不会停止进一步的代码执行。
这里有一些额外的信息链接:
比如
有什么区别 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 是一个异步函数,它 returns 一个新任务,它将在所有后续任务完成后完成。
Task.WhenAll().Wait实际上是在等待所有后续任务完成后才转到下一行代码。
在您的示例中,我确定您遇到了竞争条件,即两个示例都产生了相同的调试结果。但是, Task.WhenAll 本身没有 .Wait 实际上是异步的,如果后续任务尚未完成,将不会停止进一步的代码执行。
这里有一些额外的信息链接: