异步请求上的共享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
。
看看我的答案为什么-在WebAPI客户端中每次调用创建一个新的HttpClient的开销是多少?