我们有一个基于Unity和MVVM设计模式的WPF应用程序。在应用程序的生命周期内,可能会有多个项目生命周期,在每个项目生命周期之后,我们都会手动进行Tear Down并试图释放所有ViewModels的引用。对于Unity中的事件订阅,我们使用弱引用(weak references)。因此,我们假设在Tear Down之后,可以调用GC Collect,以便清除所有垃圾对象。我们还有另一种选项,即手动取消订阅所有事件,但是我们更喜欢垃圾回收,因为它将为我们清除约200MB,这将方便新项目的加载。
我们观察到在一个实例中,如果只调用一次GC.Collect,则其引用仍会在内存中保留一段时间。
我们观察到在一个实例中,如果只调用一次GC.Collect,则其引用仍会在内存中保留一段时间。
GC.Collect();
GC.WaitForPendingFinalizers();
但是如果我连续调用两次GC,它会很好地清理一切。
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
GC.WaitForPendingFinalizers();
非常感谢任何想法或指针。
更新:
类中没有定义终结器。
现在我还考虑了一种情况,即该对象被另一个可能具有终结器的对象引用。 在我们的框架中,只为DBProvider定义了终结器,因此我认为即使是这种情况,也不是问题所在。