문제

몇 년 전, 나는 자신의 프로세서를 사용하여 .NET의 기본 이벤트 '디스패처'구현을 무시할 수있는 방법을 설명하는 책을 읽었습니다.

    class foo {
       public event EventHandler myEvent;
       ...
    }

    ...
      myFoo.myEvent += myBar1.EventHandler;
      myFoo.myEvent += myBar2.EventHandler;

이벤트가 시작될 때마다 MYBAR1 및 MYBAR2 핸들러가 모두 호출됩니다.

내가 기억하는 것처럼,이 루프의 기본 구현은 링크 된 목록을 사용하고 단순히 목록을 반복하고 이벤트 핸들러 대의원을 순서대로 호출합니다.

내 질문은 두 배입니다.

  1. 누군가 내가 어떤 책을 읽고 있는지 알고 있습니까?
  2. 기본 구현 (책에서 답변 될 수 있음)을 무시하려는 이유는 무엇입니까?

편집 : 내가 언급 한 책은 실제로 C#을 통한 Jeffrey Richter의 CLR이었습니다.

도움이 되었습니까?

해결책

많은 책이나 웹 기사 중 하나 일 수 있습니다.

이벤트가 구독/구독되지 않은 방법을 변경하려는 여러 가지 이유가 있습니다.

  • 많은 이벤트가있는 경우, 많은 이벤트가 구독되지 않을 수도있는 경우 사용하고 싶을 수도 있습니다. EventHandlerList 메모리 사용량을 낮추려면
  • 구독/수신을 기록 할 수 있습니다
  • 가입자의 수명이 당신과 묶이는 것을 피하기 위해 약한 참조를 사용하고 싶을 수도 있습니다.
  • 구독/수신과 관련된 잠금을 변경할 수 있습니다.

나는 더 많은 것이 있다고 확신합니다 - 그것들은 내 머리 꼭대기에서 벗어났습니다 :)

편집 : 또한 구독/수신을 처리하는 맞춤형 방법과 이벤트를 제기하는 맞춤형 방법을 갖는 것에는 차이가 있습니다 (예 : 예외없이 모든 핸들러가 호출되도록 보장 할 수 있음).

다른 팁

C#을 통해 Jeffrey Richter의 CLR에서 비슷한 것을 기억하는 것 같습니다. 편집하다: 나는 그가 그것에 대해 자세히 설명한다는 것을 확실히 기억합니다.

이벤트 등록을 통제하는 데 몇 가지 다른 이유가 있습니다. 그중 하나는 수많은 이벤트가있을 때 코드 팽창을 줄이는 것입니다. 제프리 가이 책 안에서 이것에 대해 자세히 들어간 것 같아요 ...

  1. 아니
  2. 예를 들어, 핸들러 중 하나의 결과에 따라 통화 체인을 깨뜨려야 할 수도 있습니다. CustomeVentargs 객체에 '차단 된'속성이 있다고 가정 해보자 모든 추가 이벤트 핸들러 호출을 진정으로 억제합니다.
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top