我有一个需求,需要在Winform用户控件上托管WPF控件。为了实现这一点,我使用了ElementHost控件。当我运行Ants Memory profiler时,我发现ElementHost控件存在巨大的内存泄漏问题。请参考下面附加的保留图,并帮助我解决内存泄漏问题。
我有一个需求,需要在Winform用户控件上托管WPF控件。为了实现这一点,我使用了ElementHost控件。当我运行Ants Memory profiler时,我发现ElementHost控件存在巨大的内存泄漏问题。请参考下面附加的保留图,并帮助我解决内存泄漏问题。
elementHost.PropertyMap.Remove("BackgroundImage");
cachedLayoutEventArgs
泄漏问题。根据我的经验,有些情况下在Windows Forms中,已释放的控件可能会被缓存到LayoutEventArgs
中,这会阻止其正常回收。请参考Windows Forms Memory Leak线程了解详情。ElementHost
的控件时,显式调用PerformLayout()
方法,或者遵循WPF element host memory leak线程中的推荐操作。public class MyElementHost : ElementHost
{
protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
if(disposing)
{
//Use debugging tools to identify handlers and unregister
MyEventHandler myEventHandler = (MyEventHandler)Delegate.CreateDelegate(typeof(MyEventHandler), this, "childElement_MyLeakingEvent");
FrameworkElement fe = Child as FrameworkElement;
if(fe != null)
fe.MyLeakingEvent -= myEventHandler;
}
}
Child = null;
Parent = null;
}
没有任何代码的情况下很难说问题出在哪里,暗示一下,但这可能是一个不错的起点
Private Sub BrushesEH_VisibleChanged(sender As Object, e As EventArgs) Handles BrushesEH.VisibleChanged
If BrushesEH.Visible = False Then
BrushesEH.PropertyMap.Remove("BackgroundImage")
GC.Collect()
Else
BrushesEH.PropertyMap.Reset("BackgroundImage")
GC.Collect()
End If
End Sub
GC.Collect
可能有些过度了?不确定。
elementHost.PropertyMap.Clear()
。 - Heinz Kessler