我正在开发新的WPF应用程序。我只是想知道我必须在视图或视图模型中以任何方式处理或清除内存吗?
我只发现了使用com端口或任何外部设备时应该这样做的信息。
答案 0 :(得分:1)
这是一个非常普遍的问题,因此很难提供具体的答案。 .NET应用程序是垃圾收集的,因此一般情况下,一旦您不再在任何地方引用它们,就会清理它们。
需要清理的对象
垃圾收集器有些事情因为某种原因无法清理。在绝大多数情况下,您正在使用的类将实现IDisposable
接口。我遇到的最常见的事情是一次性的流和流相关的类。但是,任何时候使用您不确定的东西都是最好的。
因此,当谈到WPF中的视图和视图模型时,适用相同的规则。如果你正在使用实现IDisposable
的东西,那么你需要在完成时调用Dispose
,或者如果有意义的话,将对象的创建包装在using
块中用例。
在某些情况下,viewmodel可能拥有一次性对象的实例。在这种情况下,viewmodel本身应该实现IDisposable
,并确保它将对象置于其自己的Dispose
方法中。完成后,您需要在viewmodel上调用Dispose
。
<强>事件强>
.NET应用程序中常见的内存泄漏源是事件处理程序。一旦应用程序开始具有某种复杂性,您可能会发现临时对象(如某些视图模型)希望注册具有较长生命周期的事件(例如服务或持久性实用程序)。使用+=
运算符注册事件处理程序会创建从事件发送对象到事件处理对象的隐藏引用。您需要使用-=
运算符删除这些处理程序,以允许垃圾收集器清理处理程序和拥有它的对象。
如果您发现自己没有有效位置来确保事件未注册,请考虑使用WeakEventManager
添加处理程序而不是+=
运算符。这允许对象处理事件,而事件发送者没有对处理对象的显式引用。但是,通过这种方式注册事件会产生非常小的额外性能和内存开销,所以我不建议盲目地将所有事件处理程序切换到弱事件。在您需要的地方使用它。
请记住,有很多情况下,不注销事件是正常的,不会导致任何内存泄漏。当事件发送方和事件处理程序具有相同的生命周期时,通常就是这种情况,通常是视图及其关联的视图模型的情况。在这种情况下,视图可以在视图模型上注册事件并且永远不会注销。只要视图和视图模型都停止被任何东西引用,它们就会被清除,无论将它们链接在一起的事件如何。
<强>摘要强>
对于视图和视图模型是否需要任何特殊处理来清理它们,没有严格的规定。如果他们正在使用需要特殊清理的功能,那么您将不得不以任何适当的方式处理它。
如果您没有使用任何一次性对象或其他需要明确清理的东西,那么您不必担心的是在不再需要时删除对视图和视图模型的引用。
如果您想了解有关垃圾收集器的更多技术信息,请查看this article。了解它的工作原理可以帮助您更好地了解何时以及如何清理。