我使用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#应用程序中找不到这种情况。
答案 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);
}