私たちのWPF/MVVMアプリケーションで何らかのメモリリークを追跡しようとしていて、何かが発生しました...MVVMでは、ViewModelでモデル項目のイベントをフックするとメモリリークが発生しますか?
関連するViewModelでModelItemイベントをインスタンス固有のハンドラでリッスンすると、 ModelItemがまだ存在する限り、ViewModelItemはハングアップしますか?
が、これは漏れを起こした場合、あなたはそれをどのように/どこ外すん
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アーキテクチャには足りないので、ここで何をすべきか分かりません。
私たちのItemViewModelクラスはルートControlViewModelで管理されています(ListBoxViewModelはModelItemのリストにバインドされたListItemViewModelsを管理します)。ルートVMがUIでアンロードするタイミングを制御できるので、すべての子ViewModelItemオブジェクトのイベントリスナー。 (GCパターンがrefカウントよりもメモリのほうが優れているので、別の問題を1つ置き換えました!) – MarqueIV
GCは管理対象リソース用です。パブリッシャとサブスクライバの両方が収集を開始していない限り、明示的にアンフックする必要があるため、イベントハンドラは_managed_ではないと主張できます。 – aqwert