2010-09-23 19 views
8

Tengo un modelo de vista que se utiliza como fuente de datos para mi control personalizado. En el constructor del modelo de vista configuro un WMI ManagementEventWatcher y lo inicio. Mi modelo de vista implementa IDisposable, por lo que detengo al observador en el método Dispose.cómo limpiar el modelo de vista correctamente?

Cuando incrusto el control personalizado en una ventana, y luego cierro la ventana para salir de la aplicación arroja un InvalidComObjectException diciendo "No se puede usar el objeto COM que se ha separado de su RCW subyacente". Esto sucede debido a mi observador, y si no lo creo, no hay excepción. no hay información adicional sobre la excepción como el seguimiento de pila, etc.

Supongo que algo mantiene el modelo de vista hasta que el hilo que utiliza el observador termina pero antes de que el observador se detenga, y no sé cómo maneja esto.

¿Algún consejo? Gracias 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

sería bueno saber en qué idioma estás trabajando;) pero de todos modos ... ¿un "modelo de vista"? suena como si estuvieras mezclando cosas que realmente deberían separarse ... –

+0

estoy usando C#. Estoy trabajando en un control selector de directorio para WPF, y este control debe poder manejar montajes y desmontajes de unidades, e inserciones/extracciones de CD-ROM. ya que MVVM es la forma preferida para separar la IU del código, estoy usando un modelo de vista que devuelve la lista de unidades, directorios, etc. y supervisa las unidades. – akonsu

Respuesta

4

este artículo tiene la solución: Disposing WPF User Controls

básicamente, no parecen dos WPF usar IDisposable en cualquier lugar, por lo que la aplicación necesita para la limpieza en sí de forma explícita. entonces en mi caso, me suscribo al evento Dispatcher.ShutdownStarted de mi control que usa el modelo de vista que necesita ser eliminado, y dispongo el DataContext del control desde el controlador de eventos.

Cuestiones relacionadas