就性能而言,这两种方法会并行运行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相关问答推荐

";Make Async ValueTask/ValueTask方法分期分配发生了什么?

如何在dotnet中使用OpenTelemetry Prometheus导出器导出多个版本的度量?

在 F# 中处理 Option - Some(null) 的好策略是什么

AppShell - 返回导航失败,匹配的路由不明确......但我只注册了一次路由

.Net MAUI Android 无法与 API localhost 对话

标签从右向左增长

从 byte[] 创建 zip 文件

在 web api 控制器(.net 核心)中使用 async/await 或任务

.NET 中是否有一种简单的方法来获得数字的st、nd、rd和th结尾?

log4net 与 TraceSource

.NET 的 `Array.Sort()` 方法使用的排序算法是稳定的算法吗?

通用枚举到int的C#非装箱转换?

实例化具有运行时确定类型的对象

将 Topshelf 应用程序安装为 Windows 服务

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

你如何调试 MVC 4 API 路由?

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

在 C# 中使用委托

如何制作通用类型转换函数

为什么会出现编译错误使用未分配的局部变量?