C #: множественные рейзы - PullRequest
       3

C #: множественные рейзы

1 голос
/ 17 февраля 2012

Мой вопрос связан с событиями:

У меня есть класс с TaskAComplete Событием, которое возникает при завершении TaskA.

Когда нажата кнопка, я подписываюсь на TaskACompleteEvent

MyObject.TaskAComplete += new EventHandler(MethodToCall);

Но в другом событии я хочу отписаться от события TaskAComplete, когда событие происходит впервые.

с:

MyObject.TaskAComplete -= MethodToCall;

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

Теперь, когда я запускаю приложение и нажимаю на кнопку в первый раз, когда оно вызывает событие правильно. Но когда я нажимаюКнопка второй раз, когда Событие возникает два раза подряд.(Третий щелчок -> Событие вызывается три раза подряд и т. Д.) *

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

Почему событие происходит несколько раз?

Ответы [ 2 ]

1 голос
/ 17 февраля 2012

Когда вы подписываетесь на событие, вы подписываетесь, предоставляя делегат методу.По сути, делегат является строго типизированным объектно-ориентированным подходом к указателю на функцию C / C ++.

Этот делегат затем входит в список вызовов для этого события.1007 * вы явно создаете этот делегат.Однако, когда вы делаете -= MethodToCall, вы удаляете «автоматический» делегат.Это как если бы вы написали -= new EventHandler(MethodToCall).Очевидно, что этот новый делегат не входит в список вызовов.

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

var handler = new EventHandler(MethodToCall);
MyObject.TaskAComplete += handler;
// later on
MyObject.TaskAComplete -= handler;
0 голосов
/ 17 февраля 2012

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

Почему вы хотите отменить подписку на событие TaskAComplete?Если ваш другой код правильный, вы получите его ровно один раз для каждой задачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...