Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 4.0 事件处理程序导致内存泄漏_C# 4.0_Silverlight 4.0_Memory Leaks - Fatal编程技术网

C# 4.0 事件处理程序导致内存泄漏

C# 4.0 事件处理程序导致内存泄漏,c#-4.0,silverlight-4.0,memory-leaks,C# 4.0,Silverlight 4.0,Memory Leaks,目前,我必须修复一个正在泄漏大量内存的现有Silverlight应用程序。我用电脑设法发现了可能的问题。其中一个是围绕web服务的静态类,它包含两个支持异步计算的事件处理程序。 你已经猜到了。。。许多对象将事件分配给该处理程序,但大多数对象不会再次释放它。因此,这些对象与这些静态事件关联,因此几乎从未发布过 我需要一个简单的解决方案来解决这个问题。那么,在这些更改不产生很大影响的情况下,我有什么可能的选项来修复这个内存泄漏呢 使事件处理程序非静态将导致巨大的更改,从而导致意外的操作…使用(不知道

目前,我必须修复一个正在泄漏大量内存的现有Silverlight应用程序。我用电脑设法发现了可能的问题。其中一个是围绕web服务的静态类,它包含两个支持异步计算的事件处理程序。
你已经猜到了。。。许多对象将事件分配给该处理程序,但大多数对象不会再次释放它。因此,这些对象与这些静态事件关联,因此几乎从未发布过

我需要一个简单的解决方案来解决这个问题。那么,在这些更改不产生很大影响的情况下,我有什么可能的选项来修复这个内存泄漏呢

使事件处理程序非静态将导致巨大的更改,从而导致意外的操作…

使用(不知道是否可以使用SL)。这将允许使用调用静态方法的更脏的编程模型

更好的选择是正确订阅/取消订阅活动(同意吉尼斯),但这意味着您可以更改呼叫代码和/或要求消费者更好地开发


另一种解决方案可能是使用异步模式。可能在方法调用中等待回调委托,或者更好的方法是返回任务对象

当您不再需要事件处理程序时,您可以尝试取消分配它们?@tomasmcguinness:我想这是一种典型的情况,其中提供了一个库,但您无法控制调用方的编码质量。但你是对的,这实际上是最好的解决方案。。。对事件的订阅和取消订阅做一个干净的调用。取消分配是一个选项,但这个项目是一个大混乱。。。不是我创造的,但他们希望我能创造奇迹。:-)最大的挑战是找到我可以取消分配的正确位置。有10万行代码,不包括XAML。。。天哪!挑战在于,我无法将静态类更改为非静态类,并且有数百个地方分配了此事件,但从未发布。不过,弱事件可能会解决这个问题。