Очистка или проверка обработчиков событий в C #
6535 просмотра
4 ответа
У меня есть код C #, который обновляет некоторые свойства объекта. У меня есть обработчик событий, который поможет мне ответить, когда процесс обновления будет завершен. К сожалению, я узнал, что это событие запускается несколько раз. Я подозреваю, что это происходит, потому что обработчик события устанавливается в неправильное время. В настоящее время он устанавливается следующим образом:
myObject.Update_Succeeded += new EventHandler(myObject_Update_Succeeded);
Из-за сложности кода у меня сложное время для отслеживания того, где он должен быть установлен. Я хотел бы только установить обработчик события, он не был установлен ранее. Из-за этого я хочу сделать что-то вроде этого:
ClearEventHandlers(myObject);
или же
myObject.Update_Succeeded = null;
myObject.Update_Succeeded += new EventHandler(myObject_Update_Succeeded);
Есть ли способ выполнить то, что я пытаюсь?
Спасибо!
Автор: user609886 Источник Размещён: 13.11.2019 11:36Ответы (4)
4 плюса
Вы должны иметь возможность удалить обработчик, используя оператор вычитания, как показано ниже
myObject.Update_Succeeded -= new EventHandler(myObject_Update_Succeeded);
Или проверьте это для способа удалить все обработчики событий, если у вас есть сомнения
Как удалить все обработчики событий из элемента управления
Автор: Fadrian Sudaman Размещён: 02.08.2011 12:046 плюса
Да, вы можете настроить добавление / удаление аксессоров вашего мероприятия. Эта статья описывает эти методы доступа. Но вы можете сделать что-то вроде:
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
2 плюса
Надлежащим образом следует отсоединять обработчик от каждого события после того, как вы его больше не используете:
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:070 плюса
Вам лучше установить обработчик событий при инициализации вашего объекта, т.е. в вашем конструкторе.
Автор: Arief Размещён: 02.08.2011 12:01Вопросы из категории :
- c# Преобразовать десятичную в двойную?
- c# Как рассчитать чей-то возраст в C #?
- c# Как вы сортируете словарь по значению?
- c# В чем разница между int и Integer в Java и C #?
- c# Как создать новый экземпляр объекта из Типа
- c# Datatable против Dataset
- c# Setting Objects to Null/Nothing after use in .NET
- c# Конвертировать целые числа в записанные числа
- c# Почему я не могу иметь абстрактные статические методы в C #?
- c# Как я могу оценить код C # динамически?
- c# Как заставить кнопку выглядеть так, как будто она нажата?
- c# Цикл C # - разрыв против продолжения
- c# Почему в C # нельзя хранить объект List <string> в переменной List <object>
- c# В чем разница между строкой и строкой в ??C #?
- c# Что означает атрибут Enum [Flags] в C #?
- c# Лучший способ получить доступ к элементу управления в другой форме в Windows Forms?
- c# Преобразование общего типа из строки
- c# C # 3.0 авто-свойства - полезно или нет?
- c# Как удалить дубликаты из массива C #?
- c# Как можно создать документ Word в C #?