WPF/MVVM アプリでいくつかのメモリ リークを追跡しようとすると、何かが発生しました...
インスタンス固有のハンドラーを使用して関連付けられた ViewModel で ModelItem イベントをリッスンすると、ModelItem がまだ存在する限り、ViewModel がハングアップすることはありませんか?
この場合を考えてみましょう...
public class ItemViewModel
{
public ItemViewModel(ModelItem item)
{
this.Item = item;
item.SomeEvent += ItemSomeEventHandler
}
Public ModelItem Item { get; private set; }
// Note: This is a handler on this instance, not a shared handler
private void ItemSomeEventHandler(object s, EventArgs e)
{
Console.WriteLine(“The model changed!”);
}
}
これがリークを引き起こす場合、どのように/どこでフックを外しますか? 「Dispose」でそれを行うことはできません。何かがまだそれへの参照を持っている場合、それは呼び出されないためです。モデルアイテムのように見えます。
このViewModelが使用されているコントロールにDisposeを実装し、そこにイベントアンフックルーチンを細流化するのが適切な場所でしょうか? 自分の内部を確実にクリーンアップするために外部に依存するのは少し危険に思えますが、EventManager アーキテクチャに行くまでは、ここで何をすべきかわかりません。