async / await任务是按顺序还是并行执行的

时间:2018-01-16 17:05:45

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

以下是在底层方法中发出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
        // ...
}

2 个答案:

答案 0 :(得分:0)

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

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

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

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

答案 1 :(得分:-2)

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

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