我有这个 Windows 窗体应用程序,它每 60 秒从两个常见网页中捕获信息,对结果进行一些简单的字符串处理,并根据结果执行(或不执行)某些操作。其中一个站点没有任何保护,因此我可以轻松地使用它的 HTML 代码,HttpWebRequest
并且它是HttpWebResponse.GetResponseStream()
. 另一个有一些代码保护,我不能使用相同的方法。解决方案是使用WebBrowser
类来选择站点的所有文本并复制到剪贴板,正如Jake Drew在这里发布的(方法 1)。
当计时器达到 1 分钟时,每个方法都使用 异步执行Task
。在每个任务结束时,主线程将在这些文本中搜索一些信息,并根据结果做出一些决定。在此过程之后,即使是捕获的文本也不再相关。基本上所有东西都可以从内存中抹去,因为我会在大约 1 分钟内获得所有新东西并处理它。
一切正常,但问题是它正在逐渐增加内存使用量(每次滴答大约 20mb),这是不必要的,正如我之前所说,我不需要比开始时更多地维护内存中运行的数据应用程序的执行:
在比较了两个快照之后,我找到了这 3 个对象。显然,他们对过多的内存使用负责:
因此,即使在我将主要执行放在 Tasks 中并尽我所能帮助 Garbage Collector 之后,我仍然有这个问题。
我还能做些什么来避免这个问题或从内存中倾倒垃圾?
编辑:
这是使用以下方法捕获页面 HTML 的代码HttpWebRequest:
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL);
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) {
if (response.StatusCode == HttpStatusCode.OK) {
Stream receiveStream = response.GetResponseStream();
StreamReader readStream = null;
if (response.CharacterSet == null) {
readStream = new StreamReader(receiveStream);
} else {
readStream = new StreamReader(receiveStream, Encoding.GetEncoding(response.CharacterSet));
}
PB_value = readStream.ReadToEnd();
readStream.Close(); //Ensure
}
response.Close(); //Ensure
}
芜湖不芜
相关分类