我们有一个基于Unity和MMVVVM模式的WPF应用程序。在应用程序生命周期中,可以有多个项目生命周期,在每个项目生命周期之后,我们都进行了手动拆解,并尝试释放ViewModel的所有引用。对于Unity的事件订阅,我们使用的是弱引用。因此,我们假设拆解后可以调用GC Collect,以便所有垃圾对象都被垃圾回收。我们还有一个手动取消所有事件订阅的选项,但是我们更喜欢垃圾回收,因为它将为我们清除大约200MB的空间,这将有助于新项目的加载。
在一个实例中,我们观察到,如果我只调用一次GC.Collect,它的引用仍然会在内存中保留一段时间。
GC.Collect();
GC.WaitForPendingFinalizers();
但是,如果我尝试连续两次调用GC,它将很好地清理所有内容。
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
GC.WaitForPendingFinalizers();
任何想法或指针将不胜感激。
更新:
在类中没有定义终结器。
现在,我也在考虑一种情况,在另一个可能具有终结器的对象中引用此对象。在我们的框架中,我们只为DBProvider提供终结器,所以我不认为,即使是这种情况。
最佳答案
基本上,您听起来像带有终结器的东西-如果只调用一次GC.Collect()
,终结器将完成,但不会收集终结的对象。
那是否代表错误是另一回事。通常,确实需要执行终结器并不是一个好主意,但是对于您而言,这没关系。
关于.net - 在什么情况下,我们需要两次调用GC.Collect,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3829928/