【发布时间】:2011-04-16 10:13:18
【问题描述】:
我有一个视图模型,用作我的自定义控件的数据源。在视图模型的构造函数中,我设置了一个 WMI ManagementEventWatcher 并启动它。我的视图模型实现了IDisposable,所以我在 Dispose 方法中停止了观察者。
当我将自定义控件嵌入到窗口中,然后关闭窗口以退出应用程序时,它会抛出 InvalidComObjectException 说“无法使用已与其底层 RCW 分离的 COM 对象”。这是因为我的观察者而发生的,如果我不创建它,也不例外。没有关于异常的附加信息,例如堆栈跟踪等。
我的猜测是,在观察者使用的线程终止但在观察者停止之前,某些东西会保留视图模型,我不知道如何处理。
有什么建议吗? 谢谢 康斯坦丁
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 的首选方式,因此我使用的视图模型返回驱动器、目录等列表并监视驱动器。