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

关于:

我有这个 Windows 窗体应用程序,它每 60 秒从两个常见网页中捕获信息,对结果进行一些简单的字符串处理,并根据结果执行(或不执行)某些操作。其中一个站点没有任何保护,因此我可以轻松地使用它的 HTML 代码,HttpWebRequest并且它是HttpWebResponse.GetResponseStream(). 另一个有一些代码保护,我不能使用相同的方法。解决方案是使用WebBrowser类来选择站点的所有文本并复制到剪贴板,正如Jake Drew这里发布的(方法 1)。

额外的信息:

当计时器达到 1 分钟时,每个方法都使用 异步执行Task。在每个任务结束时,主线程将在这些文本中搜索一些信息,并根据结果做出一些决定。在此过程之后,即使是捕获的文本也不再相关。基本上所有东西都可以从内存中抹去,因为我会在大约 1 分钟内获得所有新东西并处理它。

问题:

一切正常,但问题是它正在逐渐增加内存使用量(每次滴答大约 20mb),这是不必要的,正如我之前所说,我不需要比开始时更多地维护内存中运行的数据应用程序的执行:

http://img4.mukewang.com/6190d36d0001102d06200333.jpg

在比较了两个快照之后,我找到了这 3 个对象。显然,他们对过多的内存使用负责:

http://img.mukewang.com/6190d3790001e12405320088.jpg

因此,即使在我将主要执行放在 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

    }


一只斗牛犬
浏览 283回答 1
1回答

芜湖不芜

解决了:经过一番研究,我找到了解决方案。我实际上感到有点惭愧,因为这是一个我以前从未尝试过的非常简单的解决方案,但分享仍然很重要。我做的第一件事是创建一个Event来确定我的两个任务何时完成,然后我为这个事件分配了两个功能。第一个函数强制垃圾收集器 ( GC.Collect())。第二个函数处理这两个任务,因为所有主要过程都在它们内部完成(T.Dispose())。然后我得到了我想要的结果:
打开App,查看更多内容
随时随地看视频慕课网APP