gpt4 book ai didi

wpf - mvvm light icleanup 和 messenger 在 VB.NET 中注销

转载 作者:行者123 更新时间:2023-12-03 10:53:41 26 4
gpt4 key购买 nike

我只需要一点帮助来阐明 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

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

所以我有三个问题:
  • 我什么时候应该调用这个清理方法
  • ViewModelLocator 有没有办法在应用程序关闭时取消注册所有消息收件人?
  • 这个问题不太相关,但我也希望得到一些帮助,如何判断我是否由于未注册的消息收件人而出现“内存泄漏”?

  • 谢谢你的时间

    最佳答案

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

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

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

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

    关于wpf - mvvm light icleanup 和 messenger 在 VB.NET 中注销,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14651420/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com