Относительно решения udione для утечки памяти WebBrowser - PullRequest
4 голосов
/ 20 марта 2012

Этот код был предоставлен udione в ответ на постоянный вопрос об утечке памяти в элементе управления WebBrowser в .Net .

//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); 
        } 
    } 
}  

1) Эта третья строка,

BindingOperations.ClearAllBindings(this.webbrowser); 

не будет компилироваться для меня. Какой тип this.webbrowser? Я предполагал, что это WebBrowser, но метод требует System.Windows.DependencyObject.

2) В строке

var valueSwh = field.GetValue(mainwindow);

что такое mainwindow? Форма с контролем браузера?

3) В шестой строке снизу

if (object.ReferenceEquals(sinkObject.GetValue(entry), this.webbrowser.webBrowser))  

какой тип this.webbrowser.webBrowser? Я не вижу поля с именем webBrowser в типе WebBrowser. Это просто опечатка?

Спасибо за любую помощь.

1 Ответ

0 голосов
/ 13 марта 2013
  1. BindingOperations для WPF - эта строка вам не понадобится, если вы используете WinForms.
  2. Чтобы получить mainwindow, вам просто нужно вызвать метод WPF GetWindow.
 var mainwindow = GetWindow(this);

3. this.webbrowser - это идентификатор элемента управления WPF (FrameworkElement.Name). По умолчанию это обычно webbrowser1.

...