c# – 多个等待对任务.WaitAll – 等效?
发布时间:2020-12-15 04:03:15 所属栏目:百科 来源:网络整理
导读:在性能方面,这两种方法会并行运行GetAllWidgets()和GetAllFoos()吗? 有没有理由使用一个在另一个?编译器在幕后似乎有很多事情发生,所以我不清楚. ============= MethodA:使用多个等待====================== public async TaskIHttpActionResult MethodA(
在性能方面,这两种方法会并行运行GetAllWidgets()和GetAllFoos()吗?
有没有理由使用一个在另一个?编译器在幕后似乎有很多事情发生,所以我不清楚. ============= MethodA:使用多个等待====================== public async Task<IHttpActionResult> MethodA() { var customer = new Customer(); customer.Widgets = await _widgetService.GetAllWidgets(); customer.Foos = await _fooService.GetAllFoos(); return Ok(customer); } ===============方法B:使用Task.WaitAll ===================== public async Task<IHttpActionResult> MethodB() { var customer = new Customer(); var getAllWidgetsTask = _widgetService.GetAllWidgets(); var getAllFoosTask = _fooService.GetAllFos(); Task.WaitAll(new List[] {getAllWidgetsTask,getAllFoosTask}); customer.Widgets = getAllWidgetsTask.Result; customer.Foos = getAllFoosTask.Result; return Ok(customer); } ===================================== 解决方法
第一个选项不会同时执行两个操作.它将执行第一个,等待它的完成,只有第二个.
第二个选项将同时执行,但会同步等待它们(即阻塞线程). 您不应该使用这两个选项,因为第一个完成比第二个更慢,而第二个程序阻塞一个线程而不需要. 您应该等待两个操作异步与Task.WhenAll: public async Task<IHttpActionResult> MethodB() { var customer = new Customer(); var getAllWidgetsTask = _widgetService.GetAllWidgets(); var getAllFoosTask = _fooService.GetAllFos(); await Task.WhenAll(getAllWidgetsTask,getAllFoosTask); customer.Widgets = await getAllWidgetsTask; customer.Foos = await getAllFoosTask; return Ok(customer); } 注意,在Task.WhenAll完成两个任务已经完成,等待他们立即完成. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |