C# 4.0 事件处理程序导致内存泄漏
目前,我必须修复一个正在泄漏大量内存的现有Silverlight应用程序。我用电脑设法发现了可能的问题。其中一个是围绕web服务的静态类,它包含两个支持异步计算的事件处理程序。C# 4.0 事件处理程序导致内存泄漏,c#-4.0,silverlight-4.0,memory-leaks,C# 4.0,Silverlight 4.0,Memory Leaks,目前,我必须修复一个正在泄漏大量内存的现有Silverlight应用程序。我用电脑设法发现了可能的问题。其中一个是围绕web服务的静态类,它包含两个支持异步计算的事件处理程序。 你已经猜到了。。。许多对象将事件分配给该处理程序,但大多数对象不会再次释放它。因此,这些对象与这些静态事件关联,因此几乎从未发布过 我需要一个简单的解决方案来解决这个问题。那么,在这些更改不产生很大影响的情况下,我有什么可能的选项来修复这个内存泄漏呢 使事件处理程序非静态将导致巨大的更改,从而导致意外的操作…使用(不知道
你已经猜到了。。。许多对象将事件分配给该处理程序,但大多数对象不会再次释放它。因此,这些对象与这些静态事件关联,因此几乎从未发布过 我需要一个简单的解决方案来解决这个问题。那么,在这些更改不产生很大影响的情况下,我有什么可能的选项来修复这个内存泄漏呢 使事件处理程序非静态将导致巨大的更改,从而导致意外的操作…使用(不知道是否可以使用SL)。这将允许使用调用静态方法的更脏的编程模型 更好的选择是正确订阅/取消订阅活动(同意吉尼斯),但这意味着您可以更改呼叫代码和/或要求消费者更好地开发
另一种解决方案可能是使用异步模式。可能在方法调用中等待回调委托,或者更好的方法是返回任务对象 当您不再需要事件处理程序时,您可以尝试取消分配它们?@tomasmcguinness:我想这是一种典型的情况,其中提供了一个库,但您无法控制调用方的编码质量。但你是对的,这实际上是最好的解决方案。。。对事件的订阅和取消订阅做一个干净的调用。取消分配是一个选项,但这个项目是一个大混乱。。。不是我创造的,但他们希望我能创造奇迹。:-)最大的挑战是找到我可以取消分配的正确位置。有10万行代码,不包括XAML。。。天哪!挑战在于,我无法将静态类更改为非静态类,并且有数百个地方分配了此事件,但从未发布。不过,弱事件可能会解决这个问题。