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;
}
}
}
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 ... –
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