2010-09-23 3 views
8

У меня есть модель просмотра, которая используется в качестве источника данных для моего пользовательского элемента управления. В конструкторе модели представления я настроил 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; 
     } 
    } 
} 
+0

было бы хорошо знать, с каким языком вы работаете;), но в любом случае ... «модель просмотра»? звук, как будто вы смешаете вещи, которые должны быть действительно разделены ... –

+0

Я использую C#. Я работаю над управлением селектором каталогов для WPF, и этот элемент управления должен иметь возможность обрабатывать установки и размонтирование дисков, а также вставки/удаления CD-ROM. поскольку MVVM является предпочтительным способом отделить UI от кода, я использую модель представления, которая возвращает список дисков, каталогов и т. д. и контролирует диски. – akonsu

ответ

4

эта статья имеет решение: Disposing WPF User Controls

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

Смежные вопросы