我已经编写了我的第一个 MVVM 应用程序。当我关闭应用程序时,我经常遇到由 ObjectDisposedException 引起的崩溃。在应用程序窗口消失后,应用程序死亡时出现崩溃。
获取堆栈跟踪很困难(请参阅我的另一个问题),但最后我做到了,发现我的堆栈跟踪完全包含在 C# 库中(kernel32!BaseThreadStart、mscorwks!Thread、mscorwks!WKS 等)。
此外,这种崩溃是不一致的。在我最后一次结帐和重建之后,它停止了......一段时间。然后它回来了。一旦它开始发生,它就会继续发生,即使我“清理”并重建。但是擦除和结帐有时会使其停止一段时间。
我认为正在发生的事情:
我认为 GarbageCollector 在处理我的 ViewModel 时正在做一些有趣的事情。我的 ViewModelBase 类析构函数在调用析构函数时有一个 WriteLine 来记录,在我的 4 个 ViewModel 中,只有 2 或 3 个被释放,并且它似乎因结帐而异(例如,当我在我的上运行它时,我看到一个持续重复序列,但我的同事看到了一个不同的序列,其中放置了不同的对象)。
由于堆栈跟踪中没有我的代码调用,我认为这意味着调用已处置对象的方法的不是我的代码。所以这让我觉得CLR是愚蠢的。
这有意义吗?有什么方法可以让 GC 保持一致吗?这是红鲱鱼吗?
其他可能有帮助的详细信息:
我的所有视图和视图模型都是在我的 App.xaml.cs 文件的应用程序的启动事件处理程序中创建的。同一个处理程序将 ViewModels 分配给 DataContexts。我不确定这是否是正确的 MVVM 做法(正如我所说,我的第一个 MVVM 应用程序),但我不明白为什么它会导致不良行为。
如有必要,我可以粘贴代码。