Удаление встроенного статического события - PullRequest
2 голосов
/ 17 марта 2009

У меня есть статическое событие в статическом методе, к которому я временно присоединяюсь, так как я не хочу, чтобы оно зависало в памяти или попадало в ситуацию, когда я запускаю два обработчика событий, если я вызываю его дважды.

Я мало что могу сказать о том, должны ли они быть статичными или нет, и предпочел бы не отвечать за обсуждение / рефакторинг.

Первоначально я делал это так

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, как я могу очистить и отсоединиться от статического события?

Ответы [ 2 ]

4 голосов
/ 17 марта 2009

Вы можете попробовать что-то вроде этого:

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

    try
    {
        MyStaticClass.MyEvent += handler;
    }
    finally
    {
        MyStaticClass.MyEvent -= handler;
    }
}
1 голос
/ 17 марта 2009

См. эту тему для отличного подхода.

По сути, просто сохраните свой встроенный метод в делегате и отмените его подписку во время вашего файла finally.

...