2

我在我临时附加的静态方法中有一个静态事件,因为我不希望它在内存中徘徊,或者如果我调用它两次,我会触发两个事件处理程序。

对于这些是否应该是静态的,我几乎没有发言权,并且不希望承担讨论/重构的责任。

最初我是这样做的

public static void DoSomething()
{
    try
    {
        MyStaticClass.MyEvent +=new EventHandler<HandledEventArgs>(MyStaticClass_HandleMe);
        ... //Doing Stuff
    }
    finally
    {
        MyStaticClass.MyEvent -=new EventHandler<HandledEventArgs>(MyStaticClass_HandleMe);//Detach from event
    }
}

这一直工作正常,但我想内联处理事件,以与方法中的另一个事件保持一致,以及设置一个函数本地并被另一个事件使用的取消布尔值。

public static void DoSomething()
{
    try
    {
        bool cancel = false;
        MyStaticClass.MyEvent +=new EventHandler<HandledEventArgs>(delegate(object sender, HandledEventArgs e)
        {
            cancel = true;
        })
        ... //Doing Stuff dependent on cancel = false;
    }
    finally
    {
        //???
    }
}

我的问题是,在场景 2 中,如何清理并脱离静态事件?

4

2 回答 2

4

你可以尝试这样的事情:

public static void DoSomething()
{
    bool cancel = false;
    EventHandler<EventArgs> handler = delegate { cancel = true; };

    try
    {
        MyStaticClass.MyEvent += handler;
    }
    finally
    {
        MyStaticClass.MyEvent -= handler;
    }
}
于 2009-03-17T01:31:18.363 回答
1

看到这个线程的一个很好的方法。

基本上,只需将您的内联方法存储在一个委托中,然后在您的 finally 期间取消订阅它。

于 2009-03-17T01:31:01.890 回答