5

Winform ユーザー コントロールで WPF コントロールをホストする必要があります。これを実現するために、ElementHost コントロールを使用しました。Ants Memory profiler を実行すると、ElementHost コントロールに巨大なメモリ リークがあることがわかりました。以下の添付のリテンション グラフを見つけて、Memoryleak の修正にご協力ください。ここに画像の説明を入力

4

4 に答える 4

0

独自の 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;
}

コードヒント ヒントなしで問題の場所を特定するのは難しいですが、ここから始めるのが適切です。

于 2015-03-17T19:42:01.057 に答える
0

Vadimの答えを拡張するだけです。私はElementHostTabbedControl を持っていましたが、タブで戻るたびにメモリリークが発生しました。トランスパイア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

sはGC.Collectおそらくやり過ぎですか?わからない。

于 2020-03-16T23:06:43.433 に答える