Winform ユーザー コントロールで WPF コントロールをホストする必要があります。これを実現するために、ElementHost コントロールを使用しました。Ants Memory profiler を実行すると、ElementHost コントロールに巨大なメモリ リークがあることがわかりました。以下の添付のリテンション グラフを見つけて、Memoryleak の修正にご協力ください。
2376 次
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の答えを拡張するだけです。私はElementHost
TabbedControl を持っていましたが、タブで戻るたびにメモリリークが発生しました。トランスパイア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 に答える