我要求在Winform用户控件上承载WPF控件。为了达到这个目的,我使用了ElementHost控件。当我运行Ants内存分析器时,我知道ElementHost控件中有一个巨大的内存泄漏。请找到下面附加的保留图,并请帮助我修复内存泄漏。

发布于 2015-03-17 20:03:33
这看起来像是cachedLayoutEventArgs泄漏的某种已知的WinForms问题。根据我的经验,在Windows Forms中有一些情况,当释放的控件可以缓存在LayoutEventArgs中时,它会阻止它被正确地收集。有关详细信息,请查看Windows Forms Memory Leak线程。
我建议您在释放控件时显式调用PerformLayout()方法,包含您的ElementHost或遵循WPF element host memory leak线程中的recomendation。
发布于 2019-09-19 19:48:55
我遇到了完全相同的内存泄漏情况,具有完全相同的症状。这是我处理这种情况的方式。
ElementHost类具有PropertyMap属性,该属性是将WinForms控件属性映射到WPF控件属性的集合。
在这种情况下,内存是通过保留MemoryStream实例的BackgroundImage泄漏的。因此,解决方案是删除BackgroundImage属性映射:
elementHost.PropertyMap.Remove("BackgroundImage");发布于 2015-03-18 03:42:01
我将从创建您自己的ElementHost开始,覆盖dispose,看看您是否可以在那里的事件中看到任何问题。当dispose被调用时,寻找仍然存在的处理程序。可以在dispose方法中取消注册引用
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;
}如果没有任何代码提示,很难说问题出在哪里,但这将是一个不错的起点
https://stackoverflow.com/questions/24823103
复制相似问题