在VB.NET中使用mvvm light icleanup和messenger取消注册

时间:2013-02-01 17:05:59

标签: wpf vb.net mvvm mvvm-light

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

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

这是ViewModel中名为ClientListViewModel

的注册
 ''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

这个清理是在接收消息的同一个viewmodel(CientListViewModel)中。

所以我有三个问题:

  1. 我应该何时调用此清理方法

  2. ViewModelLocator是否可以在关闭应用程序时取消注册所有邮件收件人?

  3. 这个问题不太相关,但我也很感激一些帮助,如何判断我是否因为未注册的邮件收件人而导致“内存泄漏”?

  4. 感谢您的时间

2 个答案:

答案 0 :(得分:4)

当视图模型应该被清理时#34;取决于您的应用程序和viewmodels用法。例如,我使用选项卡式界面处理应用程序。当用户关闭选项卡应用程序调用清理时,viewmodel表示该选项卡(它本身也通过其视图模型并对它们进行清理)。所以一般规则 - 只要你不再需要viewmodel - 你应该清理它(关闭子窗口,标签等)至于其他问题:

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

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

道德是 - 你应该考虑在编程期间清理资源,因为以后找到并修复它会很痛苦。

答案 1 :(得分:1)

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

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

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

  3. 当应用程序关闭时,您不必担心托管对象的这些内存泄漏,当整个应用程序域终止时,任何未引用的对象都将被删除。如果你有非托管资源被引用,这是另一个故事。