C # Отключить проблему обработчика событий - PullRequest
2 голосов
/ 20 июля 2010

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

object.Event -= new System.EventHandler(myHandler);
//my code which doesn't need event handler
object.Event += new System.EventHandler(myHandler);

Я использовал много раз, как это.но мне иногда требовалось 2 кода отключения, например:

object.Event -= new System.EventHandler(myHandler);
object.Event -= new System.EventHandler(myHandler);

конечно, я закончил с 2 кодами включения

object.Event += new System.EventHandler(myHandler);
object.Event += new System.EventHandler(myHandler);

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

но в 1 случае у меня возникла проблема.

он не работает с 2 или более кодами отключения.

мой вопрос, как можноя смотрю этот обработчик событий, если ему нужен только один код = или больше?или как мне это сделать?я всегда работал так, чтобы убедиться, что я всегда оставляю обработчик событий как первый раз

object.Event -= new System.EventHandler(myHandler);
//my code which doesn't need event handler
object.Event += new System.EventHandler(myHandler);

Ответы [ 2 ]

10 голосов
/ 20 июля 2010

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

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

Если есть какая-то причина, по которой вы не можете изменить существующий обработчик событий, как насчет созданияновый обработчик событий, который вы прикрепляете к событию, и называете старый из этого?

4 голосов
/ 20 июля 2010

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

В идеале,просто убедитесь, что вы подписываетесь только столько раз, сколько вам нужно, и должно быть очевидно, сколько раз вам нужно отписаться тоже.Обычно это будет один раз.Несколько странно, что в итоге вы получили две подписки ... Я подозреваю, что это может указывать на ошибку где-то в вашем коде.

Обратите внимание, что отмена подписки с использованием обработчика событий, который еще не подписан, не-op.

(Идея Уилла о том, что сам обработчик событий знает, действительно ли он действительно "активен", тоже хорош, кстати.)

...