簡體   English   中英

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

[英]How to clear memoryleak from ElementHost Control

我需要在 Winform 用戶控件上托管 WPF 控件。 為了實現這一點,我使用了 ElementHost 控件。 當我運行 Ants Memory profiler 時,我知道 ElementHost 控件中存在巨大的內存泄漏。 請找到以下隨附的保留圖,並幫助我修復 Memoryleak。在此處輸入圖片說明

它看起來像是某種已知的 WinForms 問題,帶有cachedLayoutEventArgs泄漏。 根據我的經驗,在 Windows 窗體中存在一些情況,即可以在LayoutEventArgs緩存已處理的控件,並且會阻止它被正確收集。 有關詳細信息,請查看Windows 窗體內存泄漏線程。

我建議你嘗試調用PerformLayout()處置器時,包含您的明確方法ElementHost或按照recomendationWPF元素的主機內存泄漏線程。

我遇到了完全相同的內存泄漏情況,症狀完全相同。 這是我處理這種情況的方式。

ElementHost 類具有PropertyMap屬性,該屬性是將 WinForms 控件屬性映射到 WPF 控件屬性的集合。

在這種特殊情況下,內存通過保留 MemoryStream 實例的 BackgroundImage 泄漏。 因此,解決方案是刪除 BackgroundImage 屬性映射:

elementHost.PropertyMap.Remove("BackgroundImage");

我會從創建您自己的 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;
}

在沒有任何代碼提示提示的情況下很難說問題出在哪里,但這將是一個不錯的起點。

只是為了擴展 Vadim 的回答。 我在ElementHost上有一個ElementHost ,每次我重新使用它時,都會出現內存泄漏。 Transpires BackgroundImage是罪魁禍首。 以下解決方案適用於發現自己處於類似困境的任何人:

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 s 可能是矯枉過正? 沒有把握。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM