httpclient导致线程池爆了

2021-02-01 15:53发布

问题:

请问webapi的高并发接口中需要其他服务的数据,处理后并返回,所以使用了httpclient。由于每个请求线程中的HttpClient线程查询.Result都被阻塞了,导致接口请求线程无法被释放,一直增加爆了线程池,这个怎么解决?

回答1:

1、不要直接.Result 使用 await
2、配置线程池
3、不要直接new HttpClient使用IHttpClientFactory



回答2:

用队列可以解决你这个问题



回答3:

使用优先队列



回答4:

贴出你的代码



回答5:

我都是用HttpWebRequest的先

using System.Net;

代码如下:

public static String sendPost(string url, string body, string contentType = "application/json;charset=UTF-8")
{
String result = null;
try
{
System.Net.ServicePointManager.Expect100Continue = false;
HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
httpWebRequest.ContentType = contentType;
httpWebRequest.Method = "POST";
httpWebRequest.Timeout = 600000;//超时600秒(10分钟)
byte[] btBodys = Encoding.UTF8.GetBytes(body);
httpWebRequest.ContentLength = btBodys.Length;
httpWebRequest.GetRequestStream().Write(btBodys, 0, btBodys.Length);
HttpWebResponse httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse();
if (httpWebResponse != null)
{
StreamReader streamReader = new StreamReader(httpWebResponse.GetResponseStream());
result = streamReader.ReadToEnd();
httpWebResponse.Close();
streamReader.Close();
}
httpWebRequest.Abort();
httpWebResponse.Close();
}
catch (Exception ex)
{
result = ex.Message;
}
return result;
}



回答6:

对于高并发场景,必须要保证自己的服务不能挂掉,正常运行。
1、使用信号量Samphore 进行限流
2、像楼上说的,如果可以的话,本地定时存或缓存其他服务的结果。



标签: httpclient c#