Вопрос:

Очистка или проверка обработчиков событий в C #

c#

6535 просмотра

4 ответа

649 Репутация автора

У меня есть код C #, который обновляет некоторые свойства объекта. У меня есть обработчик событий, который поможет мне ответить, когда процесс обновления будет завершен. К сожалению, я узнал, что это событие запускается несколько раз. Я подозреваю, что это происходит, потому что обработчик события устанавливается в неправильное время. В настоящее время он устанавливается следующим образом:

myObject.Update_Succeeded += new EventHandler(myObject_Update_Succeeded);

Из-за сложности кода у меня сложное время для отслеживания того, где он должен быть установлен. Я хотел бы только установить обработчик события, он не был установлен ранее. Из-за этого я хочу сделать что-то вроде этого:

ClearEventHandlers(myObject);

или же

myObject.Update_Succeeded = null;
myObject.Update_Succeeded += new EventHandler(myObject_Update_Succeeded);

Есть ли способ выполнить то, что я пытаюсь?

Спасибо!

Автор: user609886 Источник Размещён: 02.08.2011 11:58

Ответы (4)


0 плюса

4734 Репутация автора

Вам лучше установить обработчик событий при инициализации вашего объекта, т.е. в вашем конструкторе.

Автор: Arief Размещён: 02.08.2011 12:01

6 плюса

36040 Репутация автора

Да, вы можете настроить добавление / удаление аксессоров вашего мероприятия. Эта статья описывает эти методы доступа. Но вы можете сделать что-то вроде:

class MyClass
{
    private EventHandler _myEvent;

    public event EventHandler MyEvent
    {
        [MethodImpl(MethodImplOptions.Synchronized)]
        add 
        { 
            _myEvent = (EventHandler)Delegate.Combine(_myEvent, value);
        }
        [MethodImpl(MethodImplOptions.Synchronized)]
        remove 
        { 
            _myEvent = (EventHandler)Delegate.Remove(_myEvent, value); 
        }
    }

    public void ClearMyEvent() {
        _myEvent = null;
    }
    ...
}
Автор: CodeNaked Размещён: 02.08.2011 12:02

4 плюса

5902 Репутация автора

Решение

Вы должны иметь возможность удалить обработчик, используя оператор вычитания, как показано ниже

myObject.Update_Succeeded -= new EventHandler(myObject_Update_Succeeded);

Или проверьте это для способа удалить все обработчики событий, если у вас есть сомнения

Как удалить все обработчики событий из элемента управления

Автор: Fadrian Sudaman Размещён: 02.08.2011 12:04

2 плюса

37750 Репутация автора

Надлежащим образом следует отсоединять обработчик от каждого события после того, как вы его больше не используете:

public class MyObjectListener
{
     private readonly MyObject _object;
     public class MyObjectListener(MyObject obj)
     {
          _object = obj;
          Attach();
     }

     // adds event handlers
     private void Attach()
     {
         obj.UpdateSucceeded += UpdateSuceededHandler;
         obj.UpdateFailed += UpdateFailedHandler;
     }

     // removes event handlers
     private void Detach()
     {
         obj.UpdateSucceeded -= UpdateSuceededHandler;
         obj.UpdateFailed -= UpdateFailedHandler;
     }

     ...
}

Единственное, что вам нужно решить, это где вызывать Detachметод. Например, вы можете вызвать его в самом обработчике:

     private void UpdateSuceededHandler(object sender, Data args)
     {
         Detach();
         // do something when it succeeds
     }

     private void UpdateFailedHandler(object sender, Data args)
     {
         Detach();
         // do something when it fails
     }

Или вы можете позволить пользователям MyObjectListenerсказать, что ему больше не нужно слушать присоединенный объект:

     public void StopListening()
     {
         Detach();
     }

Объект, который вызывает событие, не должен позволять своим слушателям изменять список вызовов событий. Каждый прослушиватель событий должен подписываться или отменять подписку только на свои собственные обработчики событий.

Автор: Groo Размещён: 02.08.2011 12:07
Вопросы из категории :
32x32