【发布时间】:2019-04-08 14:46:12
【问题描述】:
我目前正在开发一项健康监控服务,该服务将调用当前机器托管的每个网站。它的作用是贯穿所有托管网站,通过 HttpClient 向每个网站调用机器并将其当前状态响应保存到数据库中。这样做的问题是,该服务在运行时会创建多个根本不会消失的 IIS 工作进程,并且内存使用量每隔几分钟就会增加 1%。我很确定这不是巧合,我已经搜索了很多关于这个问题的不同主题,但找不到适合我的结果。关于如何解决这个问题的任何想法?这是我正在使用的代码的摘录:
public void PingWebsites(List<Website> websites)
{
using (var client = new HttpClient())
{
for (int i = 0; i < websites.Count(); i++)
{
{
if (!websites[i].Environment.Contains("CI"))
{
Task<HttpResponseMessage> response = null;
try
{
response = client.GetAsync(websites[i].Address);
if (!response.Result.IsSuccessStatusCode)
{
SaveStatus(websites[i].ID, 0);
}
else
{
SaveStatus(websites[i].ID, 1);
}
}
catch (Exception e)
{
SaveStatus(websites[i].ID, 0);
}
finally {
if (response != null)
{
response.Dispose();
}
}
}
}
}
}
}
我还搜索了计时器出错和 sql 调用的可能性,但我相信这更多是 HttpClient 的问题。
编辑:我也尝试过使用一个独特的 HttpClient 实例,但内存消耗是相同的,随着时间的推移消耗越来越多,所以这不是我当前的问题。
【问题讨论】:
-
不要在 using 块中初始化 httpclient。见aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong
-
HttpClient的正确用法意味着共享单个实例,而不是每次阅读此here 时都重新创建它。至于多个 IIS 工作进程,我认为如果它们之前处于空闲状态,它们与您请求的站点有关。 -
@Daniel 我之前尝试过这种方法,但它仍然会导致内存泄漏,我觉得没有什么不同,所以我最终恢复到原始代码。随着每分钟使用率增加 1% 并且 IIS 工作进程没有消失,问题仍然存在,所以我只能假设还有另一个问题
标签: c# windows service httpclient