У меня есть модель представления, которая используется в качестве источника данных для моего пользовательского элемента управления.В конструкторе модели представления я настроил WMI ManagementEventWatcher
и запустил его.Моя модель представления реализует IDisposable
, поэтому я останавливаю наблюдателя в методе Dispose.
Когда я внедряю пользовательский элемент управления в окно, а затем закрываю окно для выхода из приложения, оно выдает выражение InvalidComObjectException
Msgstr "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;
}
}
}