首页 新闻 会员 周边 捐助

c#使用httpclient时发生内存泄漏

0
[已解决问题] 解决于 2019-10-26 10:16

.net4.5.2,window7系统下,使用httpclient每秒发送一个请求,代码如下

var fireAndForget = httpClient.GetAsync(entity.Url);

然后发现进程的内存在几分钟后就越来越多,于是我调试,截取内存快照,原因是有个对象类型是httpcontext+limitmemorystream的越来越多,最后导致内存也越来越多,请问是什么原因导致的

c#
雙孖星的主页 雙孖星 | 初学一级 | 园豆:146
提问于:2017-11-23 17:47
< >
分享
最佳答案
0

你能贴下完整点的代码么?一秒发送一个这种场景是不管前一个是否返回后面都继续发么?

奖励园豆:5
Daniel Cai | 专家六级 |园豆:10424 | 2017-11-24 09:37

谢谢你的回答,对,代码是

var httpClient = new HttpClient(
new HttpClientHandler
{
AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate,
UseCookies = false,
});
httpClient.DefaultRequestHeaders.Connection.Add("close");
httpClient.DefaultRequestHeaders.Add("Accept-Encoding", "gzip, deflate");
httpClient.DefaultRequestHeaders.Remove("UserAgent");
httpClient.DefaultRequestHeaders.Add("UserAgent", DataDefine.UserAgentDefine.GetRandomUserAgent());
httpClient.Timeout = TimeSpan.FromMinutes(1);

while (true) {var fireAndForget = httpClient.GetAsync("https://www.baidu.com");}

,网络正常,然后内存就不停地增长,为什么会这样子

雙孖星 | 园豆:146 (初学一级) | 2017-11-24 09:46

循环里有睡眠一秒task.delay(1000).wait()

雙孖星 | 园豆:146 (初学一级) | 2017-11-24 09:49

@雙孖星: 

while(true){

  var fireAndForget = httpClient.GetAsync("https://www.baidu.com");

fireAndForget.delay(1000).wait();

}

这样?

Daniel Cai | 园豆:10424 (专家六级) | 2017-11-24 10:00

@Daniel Cai: 

while (true)
{
 var fireAndForget = httpClient.GetAsync("https://www.amazon.com/product-reviews/B000G72384");
 Task.Delay(1000).Wait();
}

雙孖星 | 园豆:146 (初学一级) | 2017-11-24 10:03

@雙孖星: 

这样用的姿势感觉不太对,你换成

Task.Factory.StartNew(async ()=>{

  while(true)

  {

    await httpClient.....;

    await Task.Delay(1000);

  }

});

 

PS:返回这个task,外边去await它就可以了。确保这个方法没有重入

Daniel Cai | 园豆:10424 (专家六级) | 2017-11-24 10:22

@Daniel Cai: 方法没有重入是什么意思,重入有什么影响

雙孖星 | 园豆:146 (初学一级) | 2017-11-24 10:32

@雙孖星:

比如你这个方法对外暴露的签名是

CallxxxSite()

如果你重入了的话(多次调用),那么里面task的数量就会越来越多,而httpclient对象也会增加。

(这段代码不太清楚你的用意,所以不好描述其可能存在的问题)

Daniel Cai | 园豆:10424 (专家六级) | 2017-11-24 10:47
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册