【问题标题】:mvvm light icleanup and messenger unregister in VB.NETmvvm light icleanup 和 messenger 在 VB.NET 中注销
【发布时间】:2013-01-17 01:37:30
【问题描述】:

我只需要一点帮助来阐明 Messenger 类如何与 MVVM-Light 中的 ICleanup 一起工作。我正在使用 Mvvm-Light v4 在 VB.Net 中创建一个 WPF 4 应用程序。

我有一个信使,它注册从我创建的 NavigationService 类发送的消息,如下所示:

这是在名为 ClientListViewModel 的 ViewModel 中的注册

 ''register for messages
  Messenger.[Default].Register(Of INavigationService)(Me, "NavigationStart", False, AddressOf HandleParentChildNavigate)

这接收 NavigationService 类并根据与此问题无关的其他逻辑对其执行检查。

在我的 NavigationService 类中触发导航事件时发送消息,如下所示

''Send message that navigation has been requested
Messenger.Default.Send(Of INavigationService)(Me, "NavigationStart")

如果我的接收类(在本例中为 ClientListViewModel)有数据验证错误,这允许我取消导航事件,并将焦点返回到有错误的记录。这一切都很好。

我的问题是,我在哪里以及如何取消注册该消息。我知道我需要这样做以避免在阅读其他帖子时出现内存泄漏。我见过类似以下的内容:

Public Overrides Sub CleanUp()
    Messenger.Default.Unregister(Me)
End Sub

此清理位于接收消息的同一视图模型 (CientListViewModel) 中。

所以我有三个问题:

  1. 什么时候应该调用这个清理方法

  2. 当应用程序关闭时,ViewModelLocator 是否有办法取消注册所有消息接收者?

  3. 这个问题不太相关,但我也希望能得到一些帮助,如何判断我是否因未注册的邮件收件人而出现“内存泄漏”?

感谢您的宝贵时间

【问题讨论】:

    标签: wpf vb.net mvvm mvvm-light


    【解决方案1】:

    何时应该“清理”视图模型取决于您的应用程序和视图模型的使用情况。例如,我处理带有选项卡式界面的应用程序。当用户关闭选项卡时,应用程序会在代表该选项卡的视图模型上调用清理(它本身会通过其视图模型并在它们上调用清理)。所以一般规则 - 一旦你不再需要视图模型 - 你应该清理它(关闭子窗口,选项卡等)至于其他问题:

    2) 如果您清理视图模型,关闭应用程序确实无关紧要。关闭时所有内存都将被释放,并且您不会出现内存泄漏:)

    3) 您应该检查应用程序内存使用情况。在我们的应用程序中,我们遇到了严重的内存泄漏问题(实际上仍然存在但不是那么那么大)。我们确定我们可能会通过内存跟踪泄漏:打开/关闭了许多名为 GC.Collect() 的选项卡 - 但内存使用量并没有下降。我们开始使用 WinDbg 跟踪内存泄漏,发现确实有 很多 我们没有从 Messenger 注销收件人的地方。此外,我们正在使用绑定到 CommandManager 的旧版本 MVVM Light,因此我们在使用 RelayCommands 时也遇到了问题。

    道德是 - 您应该考虑在编程期间清理资源,因为以后查找和修复它可能会很痛苦。

    【讨论】:

      【解决方案2】:

      我没有在 MVVM-Light 中使用过 Messenger,所以我不知道是否有固有的清理方法。以下是对这些问题的一些一般性答案:

      1. 当您不再需要了解该消息或不再需要您的视图模型时,您应该进行清理。如果 Navigate 没有被取消,你的 ViewModel 是否会再关心 Navigate 消息(即它是否被卸载或者它支持的视图消失了)?如果是这种情况,那么您可以在收到导航命令并确定可以导航时取消注册。

      2. 这个我不知道。但在应用关闭时,这无关紧要(对于托管对象,请参见下文)。

      3. 当应用程序关闭时,您不必担心托管对象的这些内存泄漏,当整个应用程序域终止时,任何未引用的对象都将被丢弃。如果您引用了非托管资源,那就另当别论了。

      【讨论】:

      • duane,即使您不使用 MVVM-Light Messenger,我也很感谢您的努力,我将不得不自己搜索更多内容以正确使用 MVVM-light 的可覆盖 iCleanup 界面,但是对于其他信息,我会给你一个赞成票。我将发布我最终如何使用清理界面
      猜你喜欢
      • 2011-07-12
      • 1970-01-01
      • 2013-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-16
      相关资源
      最近更新 更多