我一直在尝试使用Silverlight,并尝试将我的Silverlight 3.0应用程序移植到Silverlight 4.0。我的应用程序加载不同的XAP文件,并在用户请求时创建Xaml用户控件的实例,并将其添加到主容器中,这是一种MEF方法,这样我就可以拥有一个可扩展和可插拔的应用程序。
这个应用程序非常庞大,为了保持性能和初始加载的可接受性,我构建了一些帮助器类,以便在后台加载以后可能会使用的所有页面和用户控件。
在Silverlight 3.0上,到目前为止,一切都运行得很顺利,没有任何问题。切换到SL4.0,我注意到,当创建用户控件的实例的过程接近时,布局会意外冻结一分钟,有时甚至更长时间。查看任务管理器,IE的内存使用量从50MB跃升到400MB,有时高达1.5 GB。
如果进程不会占用那么多内存,那么即使内存使用率仍然非常高,布局也会被正确呈现。否则所有的东西都会因为内存不足而崩溃。
运行用SL3编译的相同应用程序时,加载所有用户控件时使用的内存约为200MB。在SL3中加载应用程序的时间大约是10秒,而在SL4中需要3分钟。在布局中没有透明度,没有设置不透明,没有效果和动画。
当用户从一个屏幕切换到另一个屏幕时,会动态实例化用户控件,并故意在可视化树中添加或删除用户控件。当用户控件从可视化树中移除时,所有资源都会被正确地清除,以允许GC在后台操作。
我可能做错了什么,但我不能确定这个问题的确切来源。据我所知,SL4中没有内存分析器可以帮助我找到要查看的位置。但是,我仍然不能更新可用的新调试工具。
发布于 2010-08-23 22:30:23
更新:
修复内存泄漏的Silverlight4服务版本:http://timheuer.com/blog/archive/2010/09/01/silverlight-service-release-september-2010-gdr1.aspx
Silverlight 4有已知的内存泄漏,修复程序目前正在测试中。
这是一个关于它的Microsoft主题:
用户"heuertk“是一个Microsoft Silverlight Developer....he,解释了问题和修复的状态...
http://forums.silverlight.net/forums/t/171739.aspx
发布于 2010-05-04 22:59:57
老实说,尽管你断言“当用户控件从可视化树中移除时,所有的资源都被正确地清理了”,但这是我开始寻找的地方。它确实让人感觉到UserControls的元素没有被正确发布。
这通常发生在存在较长寿命(例如静态)的对象时,这些对象会引发更多瞬态对象所附加的事件。如果这些事件处理程序没有被分离,那么这些对象就会挂在内存中。
发布于 2010-05-05 03:29:18
我正在继续测试,并愿意分享我到目前为止的发现。这可能有助于理解SL4的行为。
由于这听起来很奇怪,UIThread渲染一堆图形组件可能需要这么长时间,考虑到微软已经改进了渲染管道,我已经将我的解决方案恢复到SL3,但我仍然将SL4安装在我的本地主机上。
应用程序使用RIA Services,来回移动到SL4意味着我必须根据发布的文档在代码中做一些更改。
如果使用Visual Studio2008进行测试,该应用程序的运行将比以前更加流畅。内存使用率低于未安装SL4时的使用率。
一旦我切换到VS2010,这就是一个完全不同的场景。内存无限增长,布局很慢,无法捕捉用户交互,有时会冻结,就像前面解释的那样。
我已经禁用了RIA服务,通过使用标准的Rest服务,该过程在质量上没有变化。
总而言之,考虑到我将继续测试,以便我最终能够理解是什么真正阻止了应用程序在可接受的模式下运行,我认为内存问题是由于VS2010的调试过程或VS2010和SL4的组合造成的
https://stackoverflow.com/questions/2761475
复制相似问题