2013-01-22 3 views
7

같은 이벤트를 eventHandler로 세 번 구독해도 문제가 있습니까? 예 :C# 이벤트 중복 구독 및 구독 취소

a.SomethingChanged += new EventHandler(ChangeHandler); 
a.SomethingChanged += new EventHandler(ChangeHandler); 
a.SomethingChanged += new EventHandler(ChangeHandler); 

이로 인해 ChangeHandler가 1 대신 3 번 호출됩니까? 이것을 처리하는 가장 좋은 방법은 무엇입니까?

이러한 중복은 함께 있지는 않지만 코드 경로의 다른 영역임을 유의하십시오.

마찬가지로 등록되지 않은 이벤트를 구독 취소하는 데 문제가 있습니까? 예 :

a.SomethingChanged -= new EventHandler(ChangeHandler); //ChangeHandler was never registered 
+0

이 질문보기 : http://stackoverflow.com/questions/817592/avoid-duplicate-event-subscriptions-in-c-sharp, 기본적으로 네,하지만 피할 수 있습니다. – Sean

+1

그것을 시험해보고 무슨 일이 일어나는 지보십시오! 궁금한 점이 있습니다. 동일한 결과가 각각에 포함될 때 독점적 인 실행 경로를 갖는 배경에는 어떤 아이디어가 있습니까? –

+0

기본적으로 이미 등록되지 않은 경우 가입 취소 (- =)의 부작용이 없습니다. 옳은? – user236215

답변

12

이벤트를 두 번 이상 구독하면 처리기가 해당 횟수 (예 : 3 번)로 호출됩니다.

문제가 발생했는지 여부는 이벤트 처리기의 기능에 따라 다르지만 여러 번 호출하지 않으려는 것으로 가정합니다.

구독하지 않은 이벤트로 구독을 취소해도 아무런 문제가 없습니다.

그래서 당신은 당신이 할 수 있습니다 (만약 당신이 정말로해야하지만) 응용 프로그램에 어떤 상태 확실하지 않은 경우 :

a.SomethingChanged -= ChangeHandler; 
... 
a.SomethingChanged += ChangeHandler; 

:

(주를 new EventHandler(...)은 문법 설탕은 생략 할 수 있습니다)
+0

글쎄, 이벤트를 두 번 이상 구독하는 데 문제가 있거나 없을 수도 있습니다. 이벤트 처리기를 여러 번 트리거하도록 할 수도 있습니다. – Servy

+0

@Servy - 엄밀히 말하면 당신 말이 맞습니다. 그러나 그것은 그 질문의 의도가 아닙니다. – ChrisF

+0

완벽한, 감사합니다! – user236215

4

같은 이벤트를 eventHandler로 세 번 구독해도 문제가되지 않습니까?

아니요. 이벤트 처리기를 세 번 추가하기 만하면됩니다.

이렇게하면 ChangeHandler가 1 대신 3 번 호출됩니까?

예.

이 문제를 해결하는 가장 좋은 방법은 무엇입니까?

원하는 것에 따라 다릅니다. 당신은 지정하지 않았습니다.

a.SomethingChanged -= new EventHandler(ChangeHandler); 
a.SomethingChanged += new EventHandler(ChangeHandler); 

문제가 구독 취소와 거기에 : 당신은 아직 추가되지 않은 경우에만 다음 바로 이벤트 핸들러를 제거하고 다시 추가하면 이벤트 핸들러를 추가하는 방법을 원하는 경우 등록되지 않은 이벤트?

아니요, 아무 것도하지 않습니다.