2013-06-04 213 views
2

我看到这段代码是别人写的:是否需要注销事件处理程序?

public class DynamicPageContent : IHttpModule 
    { 
     public void Dispose() { } 

     public void Init(HttpApplication context) 
     { 
      // it is necessary to 
      context.BeginRequest += new EventHandler(DynamicPageContent_BeginRequest); 
     } 
     //actual handler not pasting as it's meaningless for this question 
} 

正如你所看到的处理程序注册,但从来没有注销。这不会造成内存泄漏?

+2

简单 - 是的。考虑[这个答案](http://stackoverflow.com/a/621177/1283124),假设'DynamicPageContent_BeginRequest'是一个实例方法。并非所有人都同意,他实际上是一个内存泄漏(这在某种程度上与C++泄漏不同),但作为一般规则,您应该取消订阅,以便GC可以收集对象。 –

+1

@IlyaIvanov:in * theory * should not,imo。由于模块在App启动时创建一次(就我所知),并且在请求管理期间始终提供* same *实例。所以这*不应该*产生任何内存泄漏,imo。 – Tigran

+0

@Tigran抱歉,单方面和快速提示:我们能否就我们对内存泄露实际上的定义达成一致?维基有一个非常通用的定义,因为*错误地管理内存分配*,我同意 –

回答

2

事件处理可能会造成泄漏,但只能在特定条件下进行。

需要注意的是订阅对象比发布对象具有更大的生命周期。

要注意的是当发布对象的寿命比订阅对象更大时。

在这种情况下,它们看起来是同一个对象,那么取消订阅就没有必要或没用。这只会混淆你的代码。

+0

+1正确。在目前情况下,这不应该为程序产生任何问题,或者就未使用和不可用的内存部件而言,会产生泄漏*。在HTTP处理管道中总是会引用模块的* same *实例,并且如果程序“死掉”所有模块*应该“死掉”它。 – Tigran

+0

@Tigran - 是的,这是一个'全球'实例是另一个说法。 –

相关问题