相关疑难解决方法(0)

如何解决.NET Webbrowser控件中的内存泄漏问题?

这是.NET Webbrowser控件中一个众所周知的旧问题.

简介:使用.NET webbrowser控件导航到页面会增加从未释放的内存使用量.

重现内存泄漏:将WebBrowser控件添加到窗体.用它来导航到你想要的任何页面.关于:空白工作,向下滚动谷歌图像,直到您的使用量为100MB +,然后在其他地方浏览,注意几乎没有任何内存被释放是一个更戏剧性的演示.

我当前对应用程序的要求包括长时间运行它,显示有限的IE7浏览器窗口.运行IE7本身也有一些混蛋设置的钩子,BHO和组策略也是不可取的,尽管这看起来像是目前的后备.将浏览器嵌入到Windows窗体应用程序中.使用不同的浏览器基础对我来说不是一个可用的选项.IE7是必需的.

与此已知内存泄漏相关的先前主题和文章:

通常提出的修复不起作用:

  • 去不同的页面并不重要.about:blank触发泄漏.它不需要页面具有javascript或任何其他额外技术.
  • 使用不同版本的Internet Explorer无关紧要.7,8和9都表现出相同的症状,据我所知,所有版本在控件中都有相同的内存泄漏.
  • Dispose()控件没有帮助.
  • 垃圾收集没有帮助.(事实上​​,我对此进行的研究表明泄漏是在Webbrowswer控件包装的非托管COM代码中.)
  • 最小化并将进程可用内存设置为-1,-1(SetProcessWorkingSetSize()或simimlar.)仅减少物理内存使用量,对虚拟内存没有影响.
  • 调用WebBrowser.Stop()不是一个解决方案,并且打破了使用静态网页之外的任何功能的功能,而不仅仅是略微减少泄漏.
  • 在导航到另一个文档之前强制等待文档完全加载也无济于事.
  • 在单独的appDomain中加载控件不能解决问题.(我自己没有这样做,但是研究显示其他人在这条路线上没有成功.)
  • 使用不同的包装器(如csexwb2)也无济于事,因为这也会遇到同样的问题.
  • 清除Internet临时文件缓存不会执行任何操作.问题出在活动内存中,而不是磁盘上.

关闭并重新启动整个应用程序时,将清除内存.

我愿意直接在COM或Windows API中编写自己的浏览器控件,如果这是对问题的肯定修复.当然,我更喜欢一个不太复杂的修复; 我宁愿避免降低级别来做事情,因为我不想在浏览器支持的功能方面重新发明轮子.让我们在自己动手的浏览器中复制IE7功能和非标准行为.

救命?

.net browser memory memory-leaks webbrowser-control

57
推荐指数
3
解决办法
2万
查看次数

Web浏览器内存问题

我有一个.NET应用程序需要使用a WebBrowser来自动浏览一堆页面.但是,如果我去谷歌并设置谷歌即时通讯,然后搜索任何内容并手动浏览下一个按钮几次,我的应用程序使用的内存将开始增加.

问题可能是Google Instant以某种方式保留了以前页面中的数据,但即使我在其他地方导航,例如"about:blank",使用的内存也不会减少.IE 9也会出现这个问题.我开始写下我在第60页使用的内存,这就是我得到的(使用IE 9):

Page 60: 180 MB
Page 70: 214 MB
Page 80: 245 MB
Page 90: 280 MB
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,内存几乎每10页增加30 - 35 MB.如果在我离开谷歌后将释放内存,这将不会成为问题.但事实并非如此.

我也试过这个并没有做任何事情.

编辑:我做了一个项目只是为了测试这个.这是我的Form1代码:

namespace WebBrowserMemoryTest
{
    public partial class Form1 : Form
    {
        private int _Pages;

        public Form1()
        {
            InitializeComponent();
            webBrowser1.Navigate("http://www.google.com");
        }

        private void startButton_Click(object sender, EventArgs e)
        {
            _Pages = 0;
            timer1.Start();
        }

        private void stopButton_Click(object sender, EventArgs e)
        {
            timer1.Stop();
        }

        private void timer1_Tick(object sender, EventArgs e) …
Run Code Online (Sandbox Code Playgroud)

.net webbrowser-control

7
推荐指数
1
解决办法
3005
查看次数

标签 统计

.net ×2

webbrowser-control ×2

browser ×1

memory ×1

memory-leaks ×1