C# 什么';WhenAll(任务列表)和WhenAll(任务列表).Wait()之间的区别是什么?
例如,它们之间的区别是什么C# 什么';WhenAll(任务列表)和WhenAll(任务列表).Wait()之间的区别是什么?,c#,multithreading,async-await,task,wait,C#,Multithreading,Async Await,Task,Wait,例如,它们之间的区别是什么 Task<DataSet> DBTask = Task.Run (() => DBHelper.DbTest ()); Task<Boolean> CheckTimeTask = Task.Run (() => Module.CheckTime ()); Task.WhenAll (DBTask, CheckTimeTask); // <-- no wait? i
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 DBTask=Task.Run(()=>DBHelper.DbTest());
Task CheckTimeTask=Task.Run(()=>Module.CheckTime());
Task.WhenAll(DBTask,CheckTimeTask);//DBHelper.DbTest());
Task CheckTimeTask=Task.Run(()=>Module.CheckTime());
Task.WhenAll(DBTask,CheckTimeTask).Wait();// Task.WhenAll是一个异步函数,它返回一个新任务,该任务将在所有后续任务完成后完成
Task.WhenAll().Wait实际上是在移动到下一行代码之前等待所有后续任务完成
在您的示例中,我确信您遇到了一个竞争条件,其中两个示例都产生相同的调试结果。但是,Task.whell本身不带.Wait实际上是异步的,如果后续任务尚未完成,它将不会停止进一步的代码执行
以下是一些额外的信息链接:
-
-
如前所述,您的问题毫无意义,因为Task.WhenAll()
只返回一个Task
对象,该对象表示传递给它的所有Task
对象的异步完成。您的代码将丢弃返回的任务
对象,这意味着任务
将保持不被观察状态,并且对程序没有任何影响。一个正确编写的程序将在该语句上使用Wait
,而副本正好解释了这与使用Wait()
之间的区别。
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 ();
}