как правильно очистить вид модели? - PullRequest
10 голосов
/ 23 сентября 2010

У меня есть модель представления, которая используется в качестве источника данных для моего пользовательского элемента управления.В конструкторе модели представления я настроил WMI ManagementEventWatcher и запустил его.Моя модель представления реализует IDisposable, поэтому я останавливаю наблюдателя в методе Dispose.

Когда я внедряю пользовательский элемент управления в окно, а затем закрываю окно для выхода из приложения, оно выдает выражение InvalidComObjectExceptionMsgstr "COM-объект, который был отделен от базового RCW, не может быть использован".Это происходит из-за моего наблюдателя, и если я не создаю его, нет исключений.нет никакой дополнительной информации об исключении, такой как трассировка стека и т. д.

Я предполагаю, что что-то сохраняет модель представления до тех пор, пока поток, который использует наблюдатель, не завершится, но до остановки наблюдателя, и я не знаюкак справиться с этим.

Любой совет?Спасибо Константин

public abstract class ViewModelBase : IDisposable, ...
{
    ...

    protected virtual void OnDispose() { }

    void IDisposable.Dispose()
    {
        this.OnDispose();
    }
}

public class DirectorySelector : ViewModelBase
{
    private ManagementEventWatcher watcher;

    private void OnWMIEvent(object sender, EventArrivedEventArgs e)
    {
        ...
    }

    protected override void OnDispose()
    {
        if (this.watcher != null)
        {
            this.watcher.Stop();
            this.watcher = null;
        }
        base.OnDispose();
    }

    public DirectorySelector()
    {
        try
        {
            this.watcher = new ManagementEventWatcher(new WqlEventQuery(...));

            this.watcher.EventArrived += new EventArrivedEventHandler(this.OnWMIEvent);
            this.watcher.Start();
        }
        catch (ManagementException)
        {
            this.watcher = null;
        }
    }
}

1 Ответ

5 голосов
/ 24 сентября 2010

Эта статья имеет решение: Удаление пользовательских элементов управления WPF

По сути, WPF, похоже, нигде не использует IDisposable, поэтому приложение должно самоочищаться. поэтому в моем случае я подписываюсь на событие Dispatcher.ShutdownStarted из моего элемента управления, использующего модель представления, которую необходимо удалить, и удаляю DataContext элемента управления из обработчика событий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...