为了账号安全,请及时绑定邮箱和手机立即绑定

C# - 定期调用 HttpWebRequest 和 WebBrowser 的应用程序中的内存管理

C# - 定期调用 HttpWebRequest 和 WebBrowser 的应用程序中的内存管理

C#
一只斗牛犬 2021-11-14 17:14:00
关于:我有这个 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())。然后我得到了我想要的结果:

//img1.sycdn.imooc.com//6190d38c000198c706000229.jpg

查看完整回答
反对 回复 2021-11-14
  • 1 回答
  • 0 关注
  • 278 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信