У меня есть модель просмотра, которая используется в качестве источника данных для моего пользовательского элемента управления. В конструкторе модели представления я настроил 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;
}
}
}
было бы хорошо знать, с каким языком вы работаете;), но в любом случае ... «модель просмотра»? звук, как будто вы смешаете вещи, которые должны быть действительно разделены ... –
Я использую C#. Я работаю над управлением селектором каталогов для WPF, и этот элемент управления должен иметь возможность обрабатывать установки и размонтирование дисков, а также вставки/удаления CD-ROM. поскольку MVVM является предпочтительным способом отделить UI от кода, я использую модель представления, которая возвращает список дисков, каталогов и т. д. и контролирует диски. – akonsu