【问题标题】:Gecko web browser in C# does not release memory after I navigate to a new url导航到新网址后,C# 中的 Gecko Web 浏览器不会释放内存
【发布时间】:2015-04-08 10:24:42
【问题描述】:

我正在使用 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# 应用程序中找不到这种情况。

【问题讨论】:

  • 如何声明browser变量?

标签: c# memory browser gecko xulrunner


【解决方案1】:

我会试试这个:

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

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

Controls.Add(browser);

您似乎创建了多个GeckoWebBrowser 实例,这可能是问题所在。确保正确处理每个实例:

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

【讨论】:

    【解决方案2】:

    您能否告诉我以下代码是否有助于减少内存消耗?

    启动 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);
            }
    

    【讨论】:

    • 感谢您的帮助。我将我的应用程序切换到 CEF 并没有发现类似的问题。所以现在我正在研究 CEF。几天后我会试试你的方法。
    猜你喜欢
    • 2016-01-28
    • 1970-01-01
    • 2016-09-10
    • 1970-01-01
    • 2021-12-04
    • 1970-01-01
    • 2019-08-18
    • 1970-01-01
    • 2015-12-04
    相关资源
    最近更新 更多