我正在开发一个使用MVVM模式的中型WPF应用程序。ViewModels使用INotifyPropertyChanged刷新各自的视图。
这种方法非常有效,除了一个问题:当这个应用程序长时间运行(3-7天)时,视图(整个应用程序中的每个视图!)突然停止更新它们的绑定属性。
如果我在ViewModels中设置了一个断点,他们就会高兴地走开,给PropertyChanged打电话,好像什么都没有错一样。但是,如果我在视图绑定到的某个ViewModel对象的getter中设置了一个断点,则不会调用getter!
我对此感到困惑,甚至不知道如何正确地调试这个问题。我已经检查了Visual输出窗口中的数据绑定错误,但是一切看起来都正常。这就好像WPF数据绑定引擎在后台崩溃了一样。这个应用程序也在监控未处理的异常(AppDomain.UnhandledException和Dispatcher.UnhandledException),但是没有异常被抛出。
摘要:经过很长一段时间,视图停止更新它们的数据绑定,但是ViewModels仍然在调用PropertyChanged事件.。
有什么建议吗?
发布于 2012-11-09 19:33:13
经过几个月的调试,我终于能够通过将调试器附加到远程目标来解决这个问题。只有到那时,它才会产生一个我可以调试的异常。我仍然不明白为什么AppDomain.UnhandledException和Dispatcher.UnhandledException没有捕捉到这个异常,但至少我能够找到它。
发布于 2012-09-12 18:04:03
你可能是过度热心的弱引用的牺牲品。您的MVVM框架可能有一个修复程序。如果没有,这些信息可能会帮助您在源代码中找到问题。
在大多数INotifyPropertyChanged实现中都存在一个已知的内存泄漏。视图模型对XAML控件的PropertyChanged处理程序的委托进行硬引用。然后,该委托将对XAML控件进行硬引用。因此,只要视图模型存在,就无法收集控件。
因此,为了解决这个问题,许多MVVM框架使用事件的弱引用。虽然这可以修复内存泄漏,但也会导致您所看到的问题。如果弱事件没有正确实现,则可能在实际收集XAML控件之前将其删除。
我怀疑您使用的是带有弱引用的MVVM框架,并且它们正在过早地处理。要查看这是否是一个可能的问题,只需对GC.Collect()进行几次调用,并查看问题是否更频繁地发生。
https://stackoverflow.com/questions/12355087
复制相似问题