异步请求上的共享HttpClient块

本文关键字:HttpClient 共享 请求 异步 | 更新日期: 2023-09-27 18:20:43

我在HttpClient和异步请求方面遇到问题。基本上,我有一个异步方法,它使用在ctor中初始化的共享HttpClient创建异步请求。

我的问题是,当以异步方式调用我的方法时,HttpClient似乎会阻塞。

这是我的呼叫代码:

var tasks = trips.Select(u => api.Animals.GetAsync(u * 100, 100).ContinueWith(t =>
        {
            lock (animals)
            {
                if (t.Result != null)
                {
                    foreach (var a in t.Result)
                    {
                        animals.Add(a);
                    }
                }
            }
        }));
        await Task.WhenAll(tasks);

以下是使用共享HttpClient阻止的方法:

 //HttpClient blocks on each request
                var uri = String.Format("animals?take={0}&from={1}", take, from);
                var resourceSegmentUri = new Uri(uri, UriKind.Relative);
                var response = await _client.GetAsync(resourceSegmentUri);
                if (response.IsSuccessStatusCode)
                {
                    var content = await response.Content.ReadAsStringAsync();
                    var animals = JsonConvert.DeserializeObject<T>(content);
                    return animals;
                }

当为每个请求使用客户端时,这个片段不会阻塞:

using (var client = new HttpClient(){BaseAddress = new Uri(_config.BaseUrl)})
{
    var uri = String.Format("animals?take={0}&from={1}", take, from);
    var resourceSegmentUri = new Uri(uri, UriKind.Relative);
    var response = await client.GetAsync(resourceSegmentUri);
    if (response.IsSuccessStatusCode)
    {
        var content = await response.Content.ReadAsStringAsync();
        var animals = JsonConvert.DeserializeObject<T>(content);
        return animals;
    }
}

共享HttpClient是不可行的吗?或者我可以以其他方式使用它吗?

异步请求上的共享HttpClient块

实际上建议使用共享HttpClient

看看我的答案为什么-在WebAPI客户端中每次调用创建一个新的HttpClient的开销是多少?