就性能而言,这两种方法会并行运行GetAllWidgets()GetAllFoos()吗?

有什么理由用一个代替另一个吗?编译器的幕后似乎发生了很多事情,所以我不太清楚.

=方法A:使用多个等待=

public async Task<IHttpActionResult> MethodA()
{
    var customer = new Customer();

    customer.Widgets = await _widgetService.GetAllWidgets();
    customer.Foos = await _fooService.GetAllFoos();

    return Ok(customer);
}

================方法B:使用任务.韦塔尔=====================

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次完成后,这两项任务都已完成,因此等待它们立即完成.

.net相关问答推荐

在PowerShell中,XML子对象和属性是对象属性.它怎麽工作?

使用 SSH.NET 查找具有特定文件名的最新 SFTP 文件

使属性只能通过绑定的 Editor(component) 编辑

如何在 FtpWebRequest 之前判断 FTP 上是否存在文件

单线程单元 - 无法实例化 ActiveX 控件

为什么循环引用被认为是有害的?

泛型方法是如何、何时、何地具体化的?

在 WPF 窗口中获取当前聚焦的元素/控件

C#:内存不足异常

如何通过 LINQ 比较没有时间的 DateTime?

如何使用 log4net 记录跟踪消息?

什么版本的 .NET 附带什么版本的 Windows?

ObservableCollection<> 与 List<>

C# 中的 override 和 new 关键字有什么区别?

如何修复 .NET Windows 应用程序在启动时崩溃并出现异常代码:0xE0434352?

使用 DateTime.ToString() 时获取日期后缀

任何人都知道缺少枚举通用约束的好方法吗?

从 bcp 客户端接收到 colid 6 的无效列长度

从不同程序集中的类名中解析类型

泛型类的静态成员是否与特定实例相关联?