首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何清除ElementHost控件中的内存泄漏

如何清除ElementHost控件中的内存泄漏
EN

Stack Overflow用户
提问于 2014-07-18 18:41:45
回答 4查看 2.3K关注 0票数 5

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

EN

回答 4

Stack Overflow用户

发布于 2015-03-17 20:03:33

这看起来像是cachedLayoutEventArgs泄漏的某种已知的WinForms问题。根据我的经验,在Windows Forms中有一些情况,当释放的控件可以缓存在LayoutEventArgs中时,它会阻止它被正确地收集。有关详细信息,请查看Windows Forms Memory Leak线程。

我建议您在释放控件时显式调用PerformLayout()方法,包含您的ElementHost或遵循WPF element host memory leak线程中的recomendation

票数 1
EN

Stack Overflow用户

发布于 2019-09-19 19:48:55

我遇到了完全相同的内存泄漏情况,具有完全相同的症状。这是我处理这种情况的方式。

ElementHost类具有PropertyMap属性,该属性是将WinForms控件属性映射到WPF控件属性的集合。

在这种情况下,内存是通过保留MemoryStream实例的BackgroundImage泄漏的。因此,解决方案是删除BackgroundImage属性映射:

代码语言:javascript
复制
elementHost.PropertyMap.Remove("BackgroundImage");
票数 1
EN

Stack Overflow用户

发布于 2015-03-18 03:42:01

我将从创建您自己的ElementHost开始,覆盖dispose,看看您是否可以在那里的事件中看到任何问题。当dispose被调用时,寻找仍然存在的处理程序。可以在dispose方法中取消注册引用

代码语言:javascript
复制
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;
}

如果没有任何代码提示,很难说问题出在哪里,但这将是一个不错的起点

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24823103

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档