gpt4 book ai didi

c# - 在 .NET 中设置 HttpClient 以使其与多个线程一起工作并提供并发性

转载 作者:太空狗 更新时间:2023-10-30 01:14:38 29 4
gpt4 key购买 nike

阅读下面关于 HttpClient 推荐用法的帖子后,我将代码从 using block 中的每个请求实例化 HttpClient 更改为长期对象。

Do HttpClient and HttpClientHandler have to be disposed?

What is the overhead of creating a new HttpClient per call in a WebAPI client?

我的实现是低级 API 的一部分,将从运行在不同线程上的应用程序的不同部分发出请求,因此在发出请求时也需要保证线程安全和并发性。

我什至继续将其设为如下所示的单例,因此在整个应用程序中只使用了一个 HttpClient 实例。 (第四版来自 John Skeet 的文章)

http://csharpindepth.com/Articles/General/Singleton.aspx

public sealed class MyHttpClient
{
private static readonly volatile HttpClient _myHttpClient = new HttpClient();

static MyHttpClient() {}
private MyHttpClient(){ }

public static HttpClient MyHttpClientObj
{
get
{
return _myHttpClient;
}
}
}

下面是如何使用它的示例

  public IEnumerable<string> GetSomeData(string url, FormUrlEncodedContent bodyParameters)
{
try
{
//is it possible to configure timeout here instead, such that every request will have its one timeout duration?
var response = MyHttpClient.MyHttpClientObj.PostAsync(url, bodyParameters);

var result = response.Result;

if (!result.IsSuccessStatusCode)
{
//log and return null
}

var data = JsonConvert.DeserializeObject<List<string>>(result.Content.ReadAsStringAsync().Result);

return data;

}
catch (Exception ex)
{
//logging exceptions
}
}

当通过 HttpClient 发出请求时,我确保仅使用下面列出的 therad 安全方法,但在反序列化响应时,result.Content.ReadAsStringAsync().Result 被使用。这是因为更高级别的调用尚不支持异步响应。

https://msdn.microsoft.com/en-us/library/system.net.http.httpclient(v=vs.110).aspx#Anchor_5

但是,我还有几个问题。

  1. 这种方法是否线程安全且足够稳定,不会导致任何内存泄漏?
  2. 如何为每个请求配置超时?
  3. 是否有必要在 DefaultHeaders 中指定“Connection: keep-alive”?
  4. 如何为每个请求添加自定义 header /修改默认 header ?
  5. 最后,以这种方式使用 HttpClient 是否存在任何已知的性能问题/缺点?

最佳答案

它是线程安全的,推荐使用。

根据您的使用情况,最重要的可能是将连接限制提高到您想要的并发级别:

ServicePointManager.DefaultConnectionLimit = 16;

如果没有这个设置,对单个主机的并发请求将排在队列中,直到它们被发出。如果他们没有及时到达,他们就会超时。

我还建议使用流水线来提高性能:

new HttpClient(new WebRequestHandler() { AllowPipelining = true });

关于c# - 在 .NET 中设置 HttpClient 以使其与多个线程一起工作并提供并发性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42394725/

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