加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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完成两个任务已经完成,等待他们立即完成.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读