首页 > 解决方案 > 并发发送多个请求时等待 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 调用,它的响应就很好,并且可以快速启动。但是在这个块中调用它会使执行死锁。

我知道我在这里处理异步调用时搞砸了,但我不知道是什么。

谢谢。

标签: c#asynchronousconcurrency

解决方案


推荐阅读