2012-06-19 115 views
8

我希望以编程方式取消订阅事件,该事件已连线。如何取消订阅此.NET事件?

我想知道如何取消订阅EndRequest活动。

我不确定如何做到这一点,考虑到我使用的是内联代码。 (这是正确的技术术语?)

我知道我可以使用some.Event -= MethodName来取消订阅..但我没有方法名称,在这里。

我使用内联代码的原因是因为我想引用一个在事件外定义的变量(我需要......但感觉很臭......我觉得我需要通过它)。

有什么建议吗?

代码的时间..

public void Init(HttpApplication httpApplication) 
{ 
    httpApplication.EndRequest += (sender, e) => 
    { 
     if (some logic) 
      HandleCustomErrors(httpApplication, sender, e, 
           (HttpStatusCode)httpApplication.Response.StatusCode); 
    }; 

    httpApplication.Error += (sender, e) => 
      HandleCustomErrors(httpApplication, sender, e); 
} 

private static void HandleCustomErrors(HttpApplication httpApplication, 
             object sender, EventArgs e, 
             HttpStatusCode httpStatusCode = 
              HttpStatusCode.InternalServerError) 
{ ... } 

这仅仅是一些示例代码我,让我在ASP.NET应用程序处理错误。

注意:请不要将此变成关于ASP.NET错误处理的讨论。我只是在玩事件和使用这些事件来处理一些样本R/& D /学习。

回答

11

无法取消订阅匿名代理。您需要将其存储在变量中并稍后取消订阅:

EndRequestEventHandler handler = (sender, e) => 
{ 
    if (some logic) 
     HandleCustomErrors(httpApplication, sender, e, 
          (HttpStatusCode)httpApplication.Response.StatusCode); 
}; 

httpApplication.EndRequest += handler; 
// do stuff 
httpApplication.EndRequest -= handler; 
+0

从技术上讲,您可以:'httpApplication.EndRequest = null',但会取消订阅**所有**。 – CodingGorilla

+0

+1这是做到这一点的方法。 – Joe

+0

真棒:)作品!那么..代码是完美的,但我的用法是错误的。我试图在LifeCycle初始化后取消订阅事件。因此,ASP.NET框架会抛出一个令人讨厌的错误,说“你不能在init步骤后修改这些事件”。卫生署! –