2015-04-08 6 views
0

Я использую веб-браузер C# и Gecko для разработки приложения. Я обнаружил, что даже в форме есть только один GeckoWebBrowser и снова и снова перемещаться по некоторым видеостраницам, приложение будет создавать все больше и больше потоков, и приложение будет сбой после того, как я перейду на эти страницы несколько раз. Вот мои C# коды:Веб-браузер Gecko в C# не освобождает память после перехода на новый URL-адрес

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

Как Вы заявляете 'browser' переменных? –

ответ

1

Я хотел бы попробовать это:

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

Кроме того, эта линия может вызвать утечку памяти:

Controls.Add(browser); 

кажется, что вы создаете более одного экземпляра GeckoWebBrowser, и это может быть проблемой. Обязательно удаляйте все экземпляры должным образом:

//dispose the web browser control 
browser.Dispose(); 
browser = null; 
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); 
     } 
+0

Спасибо за помощь. Я переключил свое приложение на CEF и не нашел подобной проблемы. Итак, теперь я работаю над CEF. Через несколько дней я попробую. –