c# - 并发发送多个请求时等待 REST 调用完成的死锁问题
问题描述
我有以下情况。我有一个类遍历一个集合,该集合包含一个需要由某些 REST API 服务的请求列表。然后响应由另一个类处理并返回。顶级类将等待所有请求完成处理,然后再继续执行。
顶级
var results = new BlockingCollection<string>();
Task.WaitAll(requests.Select(request => Task.Run(() =>
{
var payload = new MyRequest()
{
ParameterOne = request.FieldOne,
...
};
var partialResult = this.RequestProcessingUtility.Service(payload);
results.Add(partialResult.Result);
})).ToArray());
// continues...
请求处理实用程序
public Result Convert(MyRequest request)
{
var result = new Result();
var response = this.RestUtility.Execute<Response, Request>(uri, HttpMethod.Get, request);
// processes response into result
return result;
}
实用工具
public RestResult<TResult> Execute<TResult, TRequest>(string uri, HttpMethod method, TRequest request)
where TResult : class
{
HttpResponseMessage response = null;
var message = this.CreateRequest(uri, method, request);
try
{
Task.Run(() =>
{
try
{
response = HttpClient.SendAsync(message, HttpCompletionOption.ResponseContentRead).Result;
}
catch (Exception exception)
{
throw exception;
}
})
.Wait();
}
catch (AggregateException taskException)
{
// ... something
}
return this.ProcessResult<TResult>(response); // parses HTTP Response
}
如果我在代码的其他地方同步执行对此 API 端点的 RestUtility 调用,它的响应就很好,并且可以快速启动。但是在这个块中调用它会使执行死锁。
我知道我在这里处理异步调用时搞砸了,但我不知道是什么。
谢谢。
解决方案
推荐阅读
- javascript - Moment.js 日期验证 DD-MMM-YYYY
- google-bigquery - 使用 Dataflow 将文件名和时间戳添加到 BigQuery 中的每条记录中
- java - 有没有一种方法可以比较java中不同长度的字符串?
- go - 如何提供 WASM 文件
- html - 我创建了一个 ID“滑块”并将其显示为 inline-flex 但 chrome 没有显示水平对齐的项目,为什么会这样?
- reactjs - 在 makeStyles 关键帧动画中传递道具
- arrays - 【求一些提示】将排序后的数组插入到构造的BST中
- javascript - 更新多个图表后,ChartJS 工具提示值与数据不匹配
- mongodb - 如何在spring mongodb数据中转换和比较日期
- sql - 获取 SQL 表中每个用户 ID 的最后一个元素