导航到新URL后,C#中的Gecko Web浏览器不会释放内存

时间:2015-04-08 10:24:42

标签: c# memory browser gecko xulrunner

我使用C#和Gecko Web浏览器开发应用程序。我发现即使表单上只有一个GeckoWebBrowser并且一次又一次导航到某些视频页面,应用程序将创建越来越多的线程,并且在我多次切换这些页面后应用程序将崩溃。这是我的c#代码:

private void Form1_Load(object sender, EventArgs e)
{
    textBox1.Text = "http://news.qq.com";
    string xulrunnerPath = "e:\\vm_tmp\\firefox\\xulrunner\\";
    Gecko.Xpcom.Initialize(xulrunnerPath);
}

private void button1_Click(object sender, EventArgs e)
{
    if (null == browser)
    {
        browser = new GeckoWebBrowser();
        Controls.Add(browser);
        browser.Parent = this;
        this.Tag = browser;

        browser.Location = new System.Drawing.Point(1, 100);
        browser.Name = "webControl1";
        browser.Size = new System.Drawing.Size(1280, 960);
        browser.TabIndex = 0;
        browser.Visible = true;
        browser.BringToFront();
    }

    browser.Navigate(textBox1.Text);
}

这是我的HTML代码:                                    

    <body style="padding: 0px; margin: 0px 0px;">
        <center>
            <video id="video" width="100%" autoplay="autoplay" controls="controls" loop="loop">
                <source src='movie/1.mp4' type='video/mp4' ></source>
            </video>
        </center>
    </body>
</html>

在导航之前,是否需要进行任何资源清理(在xulrunner或GeckoWebBrowser中)?我也在Firefox中测试这些页面。当我开始切换这些页面时,Firefox也会创建越来越多的线程并占用越来越多的内存。但经过几次,Firefox将释放一些线程和内存。因此,内存的使用增长非常缓慢。但我在C#应用程序中找不到这种情况。

2 个答案:

答案 0 :(得分:1)

我会试试这个:

if (null == browser)
{
    browser = new GeckoWebBrowser();
    ...
}
else 
    browser.Stop();

此行也可能导致内存泄漏:

Controls.Add(browser);

您似乎正在创建多个GeckoWebBrowser的实例,这可能是问题所在。务必妥善处理每个实例:

//dispose the web browser control
browser.Dispose();
browser = null;

答案 1 :(得分:0)

如果下面的代码有助于内存消耗,你可以告诉我吗?

启动xulrunner后,请尝试添加此定时事件和事件处理程序:

System.Windows.Forms.Timer heapMinimizerTimer = new System.Windows.Forms.Timer();
            heapMinimizerTimer.Interval = (2 * 60 * 1000); // 2 mins
            heapMinimizerTimer.Tick += new EventHandler(heapMinimizerTimer_Tick);
            heapMinimizerTimer.Start();


  private void heapMinimizerTimer_Tick(object sender, EventArgs e)
        {
            var _memoryService = Xpcom.GetService<nsIMemory>("@mozilla.org/xpcom/memory-service;1");
            _memoryService.HeapMinimize(false);
        }