2010-09-23 10 views
8

Mam model widoku, który jest używany jako źródło danych dla niestandardowego formantu. W konstruktorze widoku modelu ustawiam WMI ManagementEventWatcher i uruchamiam go. Mój model widoku implementuje IDisposable, więc zatrzymuję obserwatora w metodzie Dispose.jak prawidłowo wyczyścić model widoku?

Po osadzeniu kontrolki niestandardowej w oknie, a następnie zamknięciu okna, aby opuścić aplikację, generuje ona komunikat InvalidComObjectException, który mówi, że "Obiekt COM oddzielony od podstawowego RCW nie może być użyty". Dzieje się tak z powodu mojego obserwatora, a jeśli go nie utworzę, nie ma wyjątków. nie ma dodatkowych informacji o wyjątku, takim jak śledzenie stosu, itp.

Domyślam się, że coś zachowuje model widoku, dopóki wątek, którego używa obserwator, nie zostanie zakończony, ale przed zatrzymaniem obserwatora i nie wiem, jak to zrobić załatw to.

Każda rada? Dzięki Konstantin

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

Byłoby miło wiedzieć z jakim językiem pracujesz;) ale w każdym razie ... "modelem widoku"? brzmi jak jesteś mieszanie rzeczy, które powinny być naprawdę oddzielone ... –

+0

używam C#. Pracuję nad kontrolerem wyboru katalogów dla WPF, i ta kontrola musi być w stanie obsłużyć mount dysków i odmontować oraz insercje/usunięcia cd-rom. ponieważ MVVM jest preferowanym sposobem oddzielania interfejsu od kodu, używam modelu widoku, który zwraca listę napędów, katalogów itp. i monitoruje dyski. – akonsu

Odpowiedz

4

ten artykuł ma rozwiązanie: Disposing WPF User Controls

zasadzie dos WPF nie wydaje się używać IDisposable wszędzie, więc aplikacja musi sama czyszczenia wyraźnie. więc w moim przypadku, subskrybuję zdarzenie Dispatcher.ShutdownStarted z mojej kontroli, które używa modelu widoku, który musi zostać usunięty, i usuwam DataContext kontrolki z obsługi zdarzenia.