2012-02-17 3 views
1

Мой вопрос связан с событиями:C#: Несколько событий Поднимает

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

При нажатии кнопки я подписываюсь TaskACompleteEvent

MyObject.TaskAComplete += new EventHandler(MethodToCall); 

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

с:

MyObject.TaskAComplete -= MethodToCall; 

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

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

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

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

ответ

0

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

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

+0

У меня есть что-то вроде машины состояния, и я в разных состояниях разрешен или нет. Именно поэтому мне нужно заблокировать событие. Как это можно сделать? – rubiktubik

1

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

Этот делегат затем входит в список вызовов для мероприятия.

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

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

var handler = new EventHandler(MethodToCall); 
MyObject.TaskAComplete += handler; 
// later on 
MyObject.TaskAComplete -= handler; 
+0

Хорошо, я попробую это. Спасибо – rubiktubik

+0

Я попробовал ваше предложение, но не работал! Я снова получаю многоплановые события! Что я сделал: создайте переменную-член «обработчик» как EventHandler, затем присвойте ей «MethodToCall» с новым в конструкторе, обработчик MyObject.TaskComplete + =, чтобы подписаться на событие по методу Button_Click, а затем отмените подписку на MyObject. TaskComplete - = обработчик в другом методе Event, правильно? – rubiktubik

+0

@rubiktubik Мне нужно будет увидеть код. –

Смежные вопросы