我正在研究使用C#和
WPF构建的应用程序,它(很糟糕地)实现了MVVM.工作分解如下:
>查看
>演示文稿,位图,颜色等
>动画(如果使用)
>通过绑定数据与ViewModel进行通信
>通过在ViewModel上添加命令来与ViewModel进行通信
> ViewModel
>公开由视图调用的命令
>将数据处理功能委托给模型
>定义UI行为
>视图没有直接(命名)依赖
>通过调用模型中的方法与模型进行通信
>可以通过订阅模型公开的事件来通知模型中的更改
>模型
>磁盘持久性,数据分析等
>其他一切
>不依赖于ViewModel
不幸的是,这导致循环引用,因为视图需要引用视图模型来引发事件和激活命令,视图模型需要引用视图才能更新视图状态(通常此引用是由视图模型作为WPF的DataContext),视图模型需要引用模型来委派工作,而模型通常需要通知视图模型一些外部状态的变化.
所以我们有两个循环引用问题,viewmodel位于中间.因此,此应用程序遇到内存消耗问题,因为WPF实体正在创建并与模型中的某些数据相关联,并且这些实体永远不会被清除(直到程序终止).
这怎么应该处理?
似乎需要定义所有权图,这样一个或多个这些组件负责在事件处理程序不再相关时断开事件处理程序,以便事物可以进行GC.
最佳答案 您的问题没有提供有关实例化内容的足够信息,我怀疑如果不挖掘所有代码就可以解决这个问题.
第一:这是一个非常糟糕的MVVM,因为这里违反了层和关注点的分离.
我建议先解决这个问题.
你的问题可能是对XAML和实例化的理解很差(没有冒犯)
在不触及架构的情况下,您需要对应用程序进行概要分析,以查看哪些对象被实例化了多少次(内存热点).看看哪些GC生成这些对象可能也很有趣,因为这可能表明存在严重(手动)内存管理问题.
事件处理程序往往会造成泄漏.因此可以应用弱参考模式:http://msdn.microsoft.com/en-us/library/aa970850.aspx
一个好的MVVM有一些生命周期管理,也可以作为DI和IoC容器服务器,通过它来处理复杂的生命周期场景