gpt4 book ai didi

.net - 关于udione解决WebBrowser内存泄露的方法

转载 作者:行者123 更新时间:2023-12-03 21:33:39 26 4
gpt4 key购买 nike

此代码是 given by udione in response to the perennial question about the memory leak in the WebBrowser control in .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类型。这只是一个错字吗?

谢谢你的帮助。

最佳答案

  • BindingOperations 用于 WPF - 如果您使用的是 WinForms,则不需要此行。
  • 获取 mainwindow ,你只需要调用WPF方法 GetWindow .

  •  var mainwindow = GetWindow(this);

    3. this.webbrowser是 WPF 控件的控件 ID ( FrameworkElement.Name )。默认情况下,这通常是 webbrowser1 .

    关于.net - 关于udione解决WebBrowser内存泄露的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9788705/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com