c# – 多个等待对任务.WaitAll – 等效?

前端之家收集整理的这篇文章主要介绍了c# – 多个等待对任务.WaitAll – 等效?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
性能方面,这两种方法会并行运行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完成两个任务已经完成,等待他们立即完成.

猜你在找的C#相关文章