关于:我有这个 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 }
1 回答
芜湖不芜
TA贡献1796条经验 获得超7个赞
解决了:
经过一番研究,我找到了解决方案。我实际上感到有点惭愧,因为这是一个我以前从未尝试过的非常简单的解决方案,但分享仍然很重要。
我做的第一件事是创建一个Event
来确定我的两个任务何时完成,然后我为这个事件分配了两个功能。第一个函数强制垃圾收集器 ( GC.Collect()
)。第二个函数处理这两个任务,因为所有主要过程都在它们内部完成(T.Dispose()
)。然后我得到了我想要的结果:
- 1 回答
- 0 关注
- 316 浏览
添加回答
举报
0/150
提交
取消