【问题标题】:Does async/await tasks executed sequentially or in parallelasync/await 任务是顺序执行还是并行执行
【发布时间】:2018-06-25 11:09:52
【问题描述】:

这是在底层方法中发出 3 个 HTTP 请求以获取信息的代码,其中输入的 PIN ID 存在于 3 个产品之一中,这些产品为其提供 REST API。

它创建并等待 3 个任务。我想仔细检查这些任务是并行执行还是顺序执行

public async Task<Product> IdentifyPin(TokenParams token, string pin)
{
        Task<ApiResponse<ProductInfo, ErrorData>> productATask = GetProductAInfo(ProductType.A, pin, token.JwtToken, true);
        Task<ApiResponse<ProductInfo, ErrorData>> productBTask = GetProductBInfo(ProductType.B, pin, token.JwtToken, true);
        Task<ApiResponse<ProductInfo, ErrorData>> productCTask = GetProdctCInfo(pin, token.JwtToken, true);

        ApiResponse<ProductInfo, ErrorData> productAInfoResponse = null;
        ApiResponse< ProductInfo, ErrorData> productBInfoResponse = null;
        ApiResponse< ProductInfo, ErrorData> productCInfoResponse = null;

        // await HTTP response from ProductA info endpoint
        try
        {
            productAInfoResponse = await productATask.ConfigureAwait(false);
        }
        catch (Exception ex)
        {
            this.Log().Error(ex.Message, exception: ex);
        }

        // await HTTP response from ProductB info endpoint
        try
        {
            productBInfoResponse = await productBTask.ConfigureAwait(false);
        }
        catch (Exception ex)
        {
            this.Log().Error(ex.Message, exception: ex);
        }

        // await HTTP response from ProductC info endpoint
        try
        {
            productCInfoResponse = await productCTask.ConfigureAwait(false);
        }
        catch (Exception ex)
        {
            this.Log().Error(ex.Message, exception: ex);
        }

        // Mapping responses to new Product() and returning it
        // ...
}

【问题讨论】:

  • 我相信任务应该并行运行,但会在等待时按顺序阻塞。
  • 实际运行代码时发生了什么?它们是并行运行还是按顺序运行?
  • 您可能需要考虑 Task.WhenAll()

标签: c# .net async-await task-parallel-library


【解决方案1】:

它们将并行运行,因此在等待第一个时,第二个和第三个很可能已经完成。

(也有可能一个或多个方法返回已完成的任务,特别是如果它们可以检查记忆值并仅在必要时异步获取它)。

【讨论】:

  • “如果它们没有启动,那么每个 await 都会在等待它之前启动它的任务”await 永远不可能启动一个任务。它只会为任务添加延续。
  • @Servy 没错。我最近做的一些事情正在等待未开始的任务,但这些事情是在其他地方开始的,而不是通过await
【解决方案2】:

由于我们对GetProductAInfo 的内部运作一无所知,所以我们只能说您的代码中没有任何内容禁止服务器并行处理三个请求。

假设您的 GetProductAInfo 没有做任何低效的事情,所有三个请求将同时处于活动状态,并且可以在服务器上并行进行。

最终,由服务器决定是否应该并行、顺序或以其他方式处理三个请求(例如,一次限制为不超过 2 个活动请求)。

注意:如果您拥有 GetProductAInfo API,请考虑将其重命名为 GetProductAInfoAsync,以遵循 C# 对 async 方法的命名约定。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-14
    • 1970-01-01
    • 2017-03-25
    • 2018-12-15
    • 1970-01-01
    • 2012-10-24
    • 1970-01-01
    相关资源
    最近更新 更多