2010-09-23 11 views
8

Ho un modello di visualizzazione che viene utilizzato come origine dati per il controllo personalizzato. Nella vista costruttore del modello, ho installato un WMI ManagementEventWatcher e l'avvio. Il mio modello di vista implementa IDisposable, quindi interrompo l'osservatore nel metodo Dispose.come pulire correttamente il modello di visualizzazione?

Quando si incorpora il controllo personalizzato in una finestra, quindi si chiude la finestra per uscire dall'applicazione, viene visualizzato un messaggio InvalidComObjectException che indica che "l'oggetto COM che è stato separato dal relativo RCW sottostante non può essere utilizzato". Questo succede a causa del mio osservatore, e se non lo creo, non c'è eccezione. non ci sono informazioni aggiuntive sull'eccezione come la traccia dello stack, ecc.

La mia ipotesi è che qualcosa mantenga il modello di visualizzazione fino a quando il thread che l'osservatore utilizza termina ma prima che l'osservatore si fermi, e io non so come gestire questo.

Qualche consiglio? Grazie 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

sarebbe bello sapere con quale lingua si sta lavorando;) ma comunque ... un "modello di visualizzazione"? sembra che tu stia un po 'mescolando cose che dovrebbero essere davvero separate ... –

+0

sto usando C#. Sto lavorando su un controllo di selezione directory per WPF, e questo controllo deve essere in grado di gestire montaggi e smontaggi e inserimenti/rimozioni da cd-rom. poiché MVVM è il metodo preferito per separare l'interfaccia utente dal codice, sto utilizzando un modello di visualizzazione che restituisce l'elenco di unità, directory, ecc. e controlla le unità. – akonsu

risposta

4

questo articolo ha la soluzione: Disposing WPF User Controls

fondamentalmente, dos WPF non sembrano utilizzare IDisposable nessuna parte, quindi l'applicazione ha bisogno di pulizia in sé in modo esplicito. così nel mio caso, sottoscrivo l'evento Dispatcher.ShutdownStarted dal mio controllo che utilizza il modello di visualizzazione che deve essere smaltito e dispongo il DataContext del controllo dal gestore eventi.

Problemi correlati