2013-12-11 3 views
3

У меня проблема с утечкой памяти в управлении webBrowser. Я нашел эту тему:Ошибка утечки памяти WebBrowser

How to get around the memory leak in the .NET Webbrowser control?

и это:

//dispose to clear most of the references 
this.webbrowser.Dispose(); 
BindingOperations.ClearAllBindings(this.webbrowser); 

//using reflection to remove one reference that was not removed with the dispose 
var field = typeof(System.Windows.Window).GetField("_swh", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); 

var valueSwh = field.GetValue(mainwindow); 

var valueSourceWindow = valueSwh.GetType().GetField("_sourceWindow", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).GetValue(valueSwh); 

var valuekeyboardInput = valueSourceWindow.GetType().GetField("_keyboardInputSinkChildren", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).GetValue(valueSourceWindow); 

System.Collections.IList ilist = valuekeyboardInput as System.Collections.IList; 

lock(ilist) 
{ 
    for (int i = ilist.Count-1; i >= 0; i--) 
    { 
     var entry = ilist[i]; 
     var sinkObject = entry.GetType().GetField("_sink", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); 
     if (object.ReferenceEquals(sinkObject.GetValue(entry), this.webbrowser.webBrowser)) 
     { 
      ilist.Remove(entry); 
     } 
    } 
} 

Но я не буду использовать Windows.Forms без окна WPF и у меня есть проблемы с преобразованием этого кода к моим потребностям. Может кто-нибудь мне помочь?

+0

Вы уверены, что WinForms имеет утечку на всех? – SLaks

+0

Да. Я контролирую физическую память, которую использует мое приложение. И растет и растет (не быстро, но все же). Мое приложение - это всего лишь один веб-браузер, перемещающийся на большие пачки страниц. – Yozer

+0

Какова проблема, которая мешает вам использовать это решение? – nestedloop

ответ

3

Мы использовали Chromium в нескольких приложениях. Это позволило нам запустить HTML 5 в WinXP. Поскольку элемент управления webBrowser использует установленный IE ОС, вы не можете использовать большую часть лучшего HTML/Javascript. Microsoft не поддерживает IE WinXP, поэтому приложение может иметь доступ только к более старым версиям IE.

Если вы используете версию Chromium CEFSharp, вы можете даже скомпилировать ее в других моделях и средствах для вашей навигации, что дает вам улучшенную встроенную связь, которая не поддерживается IE.

код очень прост, и есть несколько примеров, а просто посмотреть:

InitializeComponent(); 
Text = "CefSharp"; 

web_view = new WebView("https://github.com/perlun/CefSharp", new BrowserSettings()); 
web_view.Dock = DockStyle.Fill; 
toolStripContainer.ContentPanel.Controls.Add(web_view); 
//even setup the console to log to a Textbox for debugging by setting up a Handler. 
web_view.ConsoleMessage += new CefSharp.ConsoleMessageEventHandler(ConsoleMessageHandler); 
1

Считаете ли вы использование других элементов управления веб-браузером? Там много! Я чувствую, что chromium - хорошая ставка, посмотрите this question для альтернатив.

2

Мы столкнулись с этой проблемой некоторое время назад ... безрезультатно.

Чтобы решить проблему и сохранить потребление памяти нашего приложения на разумном уровне, мы решили разделить наше приложение на два вида процессов: один для главного окна и N дочерних процессов для размещения WebBrowserControl. Затем создайте протокол трубопроводов (или RMI/RPC-like) для передачи событий из главного окна в дочерние процессы и наоборот.

В этом случае вы можете разработать стратегию утилизации с использованием пула процессов браузера и политики удаления и уничтожения фона, чтобы получить потребление памяти на контролируемом уровне.

Смежные вопросы