none
ElementHost无法被释放,导致内存泄漏 RRS feed

  • 问题

  • 写了一个WinForm嵌套WPF控件的程序。。。

    一个WinForm主窗体上有一个按钮,这个按钮打开一个WinForm窗口(ShowDialog),这个窗口里是一个ElementHost,ElementHost里包含了一个WPF控件。

    不停打开关闭这个窗口,内存会不断增加,以为是WPF控件导致的内存不释放,可是我把WPF控件删除了,也就是弹出的窗体中只有一个空的ElementHost,不停打开关闭这个窗体,内存仍然不断增长,也就是说是ElementHost导致了内存泄漏。

    尝试在窗体FormClosed事件中调用this.Dispose(); 再调用

    GC.Collect();
    GC.WaitForPendingFinalizers();
    GC.Collect();

    然并卵。

    求大神指点迷津。。。。。

    2017年8月6日 11:01

全部回复

  • 点击主页面上的一个按钮弹出一个WinForm窗口,窗口里有一个WPF页面,上面只有几个RadioButton,不断打开关闭这个窗口,内存不断增长,直到报出内存溢出的错误。

    用了SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1);物理内存虽然降低了,但是虚拟内存完全没有下降,治标不治本。然并卵。

    尝试了GC.Collect(); 然并卵。

    尝试了在窗口关闭前解绑所有事件并且将所有控件赋值null,然并卵。

    实在想不出还有什么办法。。。

    求大神指点迷津。。。。。。

    2017年8月5日 13:42
  • 别沉,顶上去
    2017年8月6日 9:06
  • 单纯模拟不出你的问题,可以上传你的代码到共享的云端和我们共享下载测试分析呢?

    ASP.NET Forum
    StackOverFlow
    FreeRice Donate
    Issues to report



    2017年8月6日 9:30
    版主
  • Sorry,代码不方便提供。。

    刚刚我把实例化WPF控件部分注释了,也就是WinForm窗口中的ElementHost中不加入任何WPF控件,然后再不停的打开关闭这个窗口,发现内存仍然再不停增长,我再把ElementHost删掉,再不停打开关闭这个窗口,内存不会增长了,也就是说根本不是WPF控件导致的内存无法被释放,而是ElementHost导致的,这种问题遇到过吗?

    2017年8月6日 10:50
  • 以下三句,90%以上的情况都不要调用。GC.Collect();
    GC.WaitForPendingFinalizers();
    GC.Collect();

    用memory profiler/dotnet profiler/clr profiler等工具监测一下,是哪句代码导致的资源未释放。


    专注于.NET ERP/CRM开发框架,C/S架构,SQL Server + ORM(LLBL Gen Pro) + Infragistics WinForms

    2017年8月7日 0:13
  • 那三句代码只是尝试i,没什么用,其实就是ElementHost导致的内存泄漏,我重新写了个非常简单的小程序,一个按钮弹出一个带ElementHost的窗口,也是同样的症状,窗口关闭,内存得不到释放。

    我网上搜了,也没有搜到ElementHost为什么内存不释放,真奇怪,至今没人遇到这种问题?

    2017年8月7日 2:01
  • Hi,

    感谢你在MSDN论坛。

    >>" GC.Collect();
    GC.WaitForPendingFinalizers();
    GC.Collect(); "

    你调用这个三个函数去手动释放内存的前提条件是,这个资源没有被引并且已经进入 1代 2代,才可以释放,不然并没有什么用,还有你这个资源能被GC管理,如果是数据库的资源,我们GC也没什么办法,还是不能释放。

    现在这个问题很明显,你调用 this.Dispose(); 这个方法,只是释放form的资源,并没有释放host这个控件的资源。 我建议你在new 这个host的资源的时候,你使用using 这个关键字,让GC去释放host资源。

    根据MSDN规则, 请不要在MSDN论坛重复发帖。   https://social.msdn.microsoft.com/Forums/zh-CN/01e45ada-a84d-4af6-8af1-2a9e5bfc70b4/wpf?forum=wpfzhchs  

    我会把两个帖子合并到一起。

    Best Regards,

    Hart


    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.


    2017年8月7日 8:37
    版主
  • 尝试在窗体FormClosed事件中调用this.Dispose(); 再调用

    你在FormClosing方法中尝试调用ElementHost的Dispose方法呢?或者在默认重写的Disposing函数中调用:

    protected override void Dispose(bool disposing)
           {
               if (disposing && (components != null))
               {
                   wpfHost.Dispose();
                   components.Dispose();
               }
               base.Dispose(disposing);
           }

    @Hart Cheng:我已经合并了楼主的帖子了。


    ASP.NET Forum
    StackOverFlow
    FreeRice Donate
    Issues to report




    2017年8月8日 4:27
    版主
  • 我也遇到了同样的问题,可尝试无论elementhost.Dispose,还是利用“using”关键字都没有解决掉该问题。高手有其他建议吗?
    2017年9月19日 2:13