2010-09-23 27 views
8

Özel denetimimin veri kaynağı olarak kullanılan bir görünüm modelim var. Görünüm modelinin yapıcısında bir WMI ManagementEventWatcher kurdum ve başlatıyorum. Görünüm modelim IDisposable'u uygular, bu yüzden izleyiciyi Dispose yönteminde durdururum.Modeli nasıl düzgünce temizlerim?

Özel denetimi bir pencereye gömdüğümde ve ardından uygulamadan çıkmak için pencereyi kapattığımda, bir "InvalidComObjectException" ifadesi, "Temel RCW'den ayrılmış COM nesnesi kullanılamaz" ifadesini atar. Bu benim izleyicimden kaynaklanıyor ve eğer onu yaratmazsam, bir istisna yok. yığın izlemesi, vb. gibi istisna hakkında ek bilgi yoktur.

Tahmincim, izleyicinin kullandığı iş parçacığı sona erene kadar ancak izleyici durdurulmadan önce görünüm modelini tutan bir şeydir ve nasıl yapılacağını bilmiyorum Bunu hallet.

Herhangi bir öneri? Teşekkür 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

, hangi dilde çalıştığınızı bilmek güzel olurdu;) ama yine de ... bir "görünüm modeli"? Söylemek istediğiniz gibi gerçekten ayrılmak zorunda olan şeyleri karıştırmak gibi ... –

+0

C# kullanıyorum. WPF için bir dizin seçici kontrolünde çalışıyorum ve bu kontrol, sürücü bağlantılarını ve bağlantılarını kaldırabilmeli ve cd-rom ekleme/çıkarma işlemlerini gerçekleştirebilmelidir. UI'yi koddan ayırmanın tercih edilen yolu MVVM olduğundan, sürücüler, dizinler vb. listesini döndüren ve sürücüleri izleyen bir görünüm modeli kullanıyorum. – akonsu

cevap

4

bu makale çözümü vardır: Disposing WPF User Controls

temelde, WPF dos yerde IDisposable kullanmak görünmüyor, bu yüzden uygulama açıkça temizleme kendisi gerekiyor. Bu yüzden benim durumumda, kontrolümün elden çıkarılması gereken görünüm modelini kullanan Dispatcher.ShutdownStarted olayına abone oluyorum ve kontrolün DataContextini olay işleyicisinden elden çıkarıyorum.

İlgili konular