【发布时间】:2010-08-13 06:27:21
【问题描述】:
我目前在使用 MVVM WPF 应用程序时遇到了一些问题。在应用程序中,ViewModel 使用 ResourceDictionary 中的 DataTemplate 作为 View 的 DataContext 关联——这样,两个对象都没有对另一个对象的代码内引用。我的 ViewModel 有一个非托管资源,当我的 ViewModel 消失时需要释放它。 (在这种情况下,我的资源是一个使用外部 DLL 的类)
如果我实际上不使用 DLL,当我关闭应用程序时,我的非托管资源的终结器会被调用,它会清理 DLL(我正在实现 IDisposable)。那里一切都很好。
如果我使用 DLL,当我关闭应用程序时,我的资源的终结器不会被调用并且进程不会结束。如果我中断,我可以看到 DLL 在调用 System.Net.Sockets.Socket.Receive() 时被阻塞。我假设正在发生的事情是我的 DLL 以某种方式超过了我的 ViewModel,因此 ViewModel 永远不会被最终确定。
从我读到的内容来看,依赖一个正在完成的对象是一个糟糕的设计——你不能相信 GC。那么,当我想关闭应用程序时,我必须在我的资源上调用 CleanUp() 哪些选项 - 鉴于 View 和 ViewModel 没有相互引用?
编辑:对于一些额外的阅读,这是我参考的关于终结器的blog post。
编辑 2:我想出了一个我相当满意的解决方案,所以我想我会为后代添加它并伪关闭这个问题。在应用程序启动时,我为我的应用程序初始化主视图和 ViewModel,因此它是对两者都有引用的一个来源。我在View.Closed 上附加了一个 EventHandler,它触发了我的 ViewModel 上的 CleanUp() 方法,该方法能够在整个应用程序中传播该逻辑。我维护 MVVM 并轻松清理违规资源。
【问题讨论】: