Я написал некоторый код для обработки события следующим образом:
AddHandler myObject.myEvent, AddressOf myFunction
Казалось, что все работало сначала, но когда я выполнил отладчик, я обнаружил это часто, myFunction
несколько раз работал бы каждый раз myObject.myEvent
запущенный. Я выяснил, что позволил коду добавлять обработчик событий для выполнения несколько раз, приведя к этому поведению.
Существует ли способ, которым я могу сделать что-то вроде этого?
If myObject.myEvent is not handled Then
AddHandler myObject.myEvent, AddressOf myFunction
End If
Предполагая, что событие публикуется не вашим кодом, вы не сможете. Идея состоит в том, что подписчики изолированы друг от друга - вы не можете узнать о других подписчиках событий, сами инициировать событие и т. Д.
Если проблема в том, что вы добавляете свой собственный обработчик несколько раз, вы сможете исправить это самостоятельно, отслеживая, вы добавили обработчик. Идея Стивена удалить обработчик перед его добавлением - интересный обходной путь: можно попытаться удалить обработчик, даже если он не подписан. Однако я бы рассматривал это как обходной путь к вашему приложению, не зная, что оно должно делать. Это очень быстрое краткосрочное решение, но я бы побеспокоился о том, чтобы оставить его на более долгий срок.
Невозможно определить, что обработчик уже подключен, но вы можете безопасно вызвать RemoveHandler для события перед вызовом AddHandler. Если обработчика еще нет, RemoveHandler не подействует.
Сохраните результаты обработчика событий в базе данных / сеансе, а затем прочитайте их снова, чтобы проверить, было ли событие уже обработано.
Либо:
Не добавляйте обработчик больше, чем однажды.
Попытка удалить обработчик просто перед его добавлением.