2012-04-24 52 views
0

目前,我必须修复现有的泄漏大量内存的Silverlight应用程序。使用Redgate's ANT profiler我设法检测到可能的问题。其中之一是一个静态类,它封装了一个Web服务,它包含两个事件处理程序来支持异步计算。
你已经猜到了......很多对象都给这个处理程序分配了一个事件,但是大多数对象不会再次释放它。因此,这些对象链接到这些静态事件,因此几乎从未发布...由于事件处理程序而导致内存泄漏

我需要一个简单的修复程序来解决此问题。那么,我有什么可能的选择来解决这个内存泄漏问题,而这些更改没有太大的影响?

使得事件处理非静态将导致巨大的变化,因此不希望的动作......

+0

你可以尝试取消分配事件处理程序,当你不再需要它们? – tomasmcguinness 2012-04-24 08:47:28

+0

@tomasmcguinness:我想这是提供库的典型场景,但是您无法控制调用者的编码质量。但是你是对的,这实际上是最好的解决方案......做一个干净的通话与订阅和取消订阅事件。 – 2012-04-24 08:54:49

+0

取消分配是一个选项,但这个项目是一个大混乱...我没有创造它,但他们期望我执行奇迹。 :-)最大的挑战是找到我可以取消分配的正确位置。用100.000行代码,不包括XAML ... Blimey! – 2012-04-24 09:00:26

回答

2

使用Weak Event pattern(不知道是否有可能与SL)。这将允许一个更肮脏的编程模型调用你的静态方法。

一个更好的选择是正确订阅/取消订阅事件(同意tomasmcguinness),但这意味着您可以更改调用代码和/或要求消费者更好地开发。

另一种解决方案可以使用异步模式。也许在方法调用中等待一个Callback委托,或者甚至更好的是返回一个Task对象。

+0

挑战在于我无法将静态类更改为非静态类,并且有数百个地方分配了此事件,但从未发布过。但是,弱事件可能会解决它。 – 2012-04-24 09:35:51