gpt4 book ai didi

c# - 异步请求上的共享 HttpClient block

转载 作者:太空狗 更新时间:2023-10-29 23:39:32 25 4
gpt4 key购买 nike

我遇到了 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

查看我的回答,原因 - What is the overhead of creating a new HttpClient per call in a WebAPI client?

关于c# - 异步请求上的共享 HttpClient block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17399617/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com