как правильно очистить модель представления?

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

Когда я встраиваю настраиваемый элемент управления в окно, а затем закрываю окно, чтобы выйти из приложения, он выдает исключение InvalidComObjectException , говорящее: «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;
        }
    }
}
12
задан Ramzi Khahil 3 July 2017 в 08:19
поделиться