Приведет ли этот стиль кодирования к утечке памяти - PullRequest
6 голосов
/ 30 марта 2011

В соответствии с шаблоном MVVM я пытаюсь подключить отображение дочернего окна при помощи View в ответ на запрос от модели представления.

Используя MVVM-Light Messenger, View будет регистрироваться длязапрос на отображение дочернего окна в конструкторе представления следующим образом:

InitializeComponent();
Messenger.Default.Register<EditorInfo>(this, (editorData) =>
{
    ChildWindow editWindow = new EditWindow();
    editWindow.Closed += (s, args) =>
    {
        if (editWindow.DialogResult == true)
            // Send data back to VM
        else
           // Send 'Cancel' back to VM
   };

   editWindow.Show();
});

Подпишется ли подписка на закрытое событие ChildWindow с использованием лямбды, что вызывает проблемы со сборкой мусора.Или, другими словами, когда (если вообще когда-либо) окно editWindow станет не связанным, и поэтому он станет кандидатом на сборку мусора.

1 Ответ

4 голосов
/ 30 марта 2011

editWindow сохранит ссылку на this, но ничто не будет иметь ссылку на editWindow, поэтому в конечном итоге это будет сбор мусора, а ссылка на this будет отброшена.Так что это не должно вызывать утечку памяти ...

Если вы хотите быть уверены, что проблем не будет, вы можете отписаться от события:

InitializeComponent();
Messenger.Default.Register<EditorInfo>(this, (editorData) =>
{
    ChildWindow editWindow = new EditWindow();
    EventHandler handler = (s, args) =>
    {
        editWindow.Closed -= handler;
        if (editWindow.DialogResult == true)
            // Send data back to VM
        else
           // Send 'Cancel' back to VM
   };

   editWindow.Closed += handler;

   editWindow.Show();
});
...