У меня есть модель представления, которая используется в качестве источника данных для моего настраиваемого элемента управления. В конструкторе модели представления я установил WMI ManagementEventWatcher
и запустил его. Моя модель представления реализует IDisposable
, поэтому я останавливаю наблюдателя в методе Dispose.
Когда я встраиваю настраиваемый элемент управления в окно, а затем закрываю окно, чтобы выйти из приложения, он выдает исключение InvalidComObjectException
, говорящее: «COM-объект, который был разделен из лежащего в его основе RCW использовать нельзя ". Это происходит из-за моего наблюдателя, и если я его не создаю, не будет исключения. нет никакой дополнительной информации об исключении, такой как трассировка стека и т. д.
Я предполагаю, что что-то сохраняет модель представления до тех пор, пока поток, который использует наблюдатель, не завершится, но до того, как наблюдатель будет остановлен, и я не знаю, как обрабатывать это.
Есть совет? Спасибо Константин
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;
}
}
}