以下是在底层方法中发出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
// ...
}
答案 0 :(得分:0)
由于我们对GetProductAInfo
的内部工作原理一无所知,我们可以说的是,您的代码中没有任何内容禁止服务器并行处理这三个请求。
假设您的GetProductAInfo
没有做任何非常低效的事情,所有三个请求将同时处于活动状态,并且可以在服务器上并行进行。
最终,由服务器决定是否应该并行,按顺序或以其他方式处理这三个请求(例如,一次限制为不超过2个活动请求)。
注意:如果您拥有GetProductAInfo
API,请考虑将其重命名为GetProductAInfoAsync
,以遵循C#的async
方法的命名惯例。
答案 1 :(得分:-2)
它们将并行运行,因此当第一个和第三个等待时,第二个和第三个可能已经完成。
(也有可能一个或多个方法返回已完成的任务,特别是如果它们可以检查一个记忆值并且只在必要时异步获取它。)