gpt4 book ai didi

wpf - 如何正确清理 View 模型?

转载 作者:行者123 更新时间:2023-12-03 10:12:12 25 4
gpt4 key购买 nike

我有一个 View 模型,用作我的自定义控件的数据源。在 View 模型的构造函数中,我设置了一个 WMI ManagementEventWatcher并启动它。我的 View 模型实现了 IDisposable ,所以我在 Dispose 方法中停止了观察者。

当我将自定义控件嵌入到窗口中,然后关闭窗口以退出应用程序时,它会抛出 InvalidComObjectException说“不能使用已经与其底层 RCW 分离的 COM 对象”。这是因为我的观察者,如果我不创建它,也不异常(exception)。没有关于异常的附加信息,例如堆栈跟踪等。

我的猜测是,在观察者使用的线程终止但在观察者停止之前,某些东西会保持 View 模型,我不知道如何处理这个问题。

有什么建议吗?
谢谢
康斯坦丁

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

最佳答案

这篇文章有解决办法:Disposing WPF User Controls

基本上,WPF 似乎没有在任何地方使用 IDisposable,因此应用程序需要明确地清理自己。所以在我的情况下,我从我的控件订阅 Dispatcher.ShutdownStarted 事件,该事件使用需要处理的 View 模型,并从事件处理程序中处理控件的 DataContext。

关于wpf - 如何正确清理 View 模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3781253/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com