例如:
public class Person
{
public Person()
{
}
~Person()
{
}
}
Run Code Online (Sandbox Code Playgroud)
我什么时候应该手动创建析构函数?什么时候需要创建析构函数?
我编写了我的第一个MVVM应用程序.当我关闭应用程序时,我常常因ObjectDisposedException而导致崩溃.应用程序窗口消失后,应用程序即将崩溃.
获取堆栈跟踪很困难(参见我的另一个问题),但最后我做了,发现我的堆栈跟踪完全包含在C#库中(kernel32!BaseThreadStart,mscorwks!Thread,mscorwks!WKS等).
此外,这种崩溃是不一致的.在我上次结账和重建之后,它停止了一段时间.然后它又回来了.一旦它开始发生,它就会不断发生,即使我"清理"并重建.但擦拭和结账有时会使它停止一段时间.
我认为发生了什么:
我认为GarbageCollector在处理我的ViewModel时做的很有趣.我的ViewModelBase类析构函数在调用析构函数时有一个WriteLine来记录,而我的4个ViewModel中只有2或3个被处理掉了,它似乎根据结账而变化(例如,当我在我的运行时,我看到一直在重复顺序,但我的同事看到不同的序列与不同的对象处置).
由于堆栈跟踪没有我的代码调用,我认为这意味着我的代码不是调用被处置对象的方法.所以这让我觉得CLR是愚蠢的.
这有意义吗?有什么方法可以让GC保持一致吗?这是红鲱鱼吗?
其他可能
有用的细节:我的所有Views和ViewModel都是在App.xaml.cs文件的Application的Startup事件处理程序中创建的.同一个处理程序将ViewModels分配给DataContexts.我不确定这是否是正确的MVVM实践(正如我所说的,我的第一个MVVM应用程序),但我不明白为什么它会导致不良行为.
如有必要,我可以粘贴代码.