자신의 Custom .NET 이벤트 처리 루프를 수행합니다
-
03-07-2019 - |
문제
몇 년 전, 나는 자신의 프로세서를 사용하여 .NET의 기본 이벤트 '디스패처'구현을 무시할 수있는 방법을 설명하는 책을 읽었습니다.
class foo {
public event EventHandler myEvent;
...
}
...
myFoo.myEvent += myBar1.EventHandler;
myFoo.myEvent += myBar2.EventHandler;
이벤트가 시작될 때마다 MYBAR1 및 MYBAR2 핸들러가 모두 호출됩니다.
내가 기억하는 것처럼,이 루프의 기본 구현은 링크 된 목록을 사용하고 단순히 목록을 반복하고 이벤트 핸들러 대의원을 순서대로 호출합니다.
내 질문은 두 배입니다.
- 누군가 내가 어떤 책을 읽고 있는지 알고 있습니까?
- 기본 구현 (책에서 답변 될 수 있음)을 무시하려는 이유는 무엇입니까?
편집 : 내가 언급 한 책은 실제로 C#을 통한 Jeffrey Richter의 CLR이었습니다.
해결책
많은 책이나 웹 기사 중 하나 일 수 있습니다.
이벤트가 구독/구독되지 않은 방법을 변경하려는 여러 가지 이유가 있습니다.
- 많은 이벤트가있는 경우, 많은 이벤트가 구독되지 않을 수도있는 경우 사용하고 싶을 수도 있습니다. EventHandlerList 메모리 사용량을 낮추려면
- 구독/수신을 기록 할 수 있습니다
- 가입자의 수명이 당신과 묶이는 것을 피하기 위해 약한 참조를 사용하고 싶을 수도 있습니다.
- 구독/수신과 관련된 잠금을 변경할 수 있습니다.
나는 더 많은 것이 있다고 확신합니다 - 그것들은 내 머리 꼭대기에서 벗어났습니다 :)
편집 : 또한 구독/수신을 처리하는 맞춤형 방법과 이벤트를 제기하는 맞춤형 방법을 갖는 것에는 차이가 있습니다 (예 : 예외없이 모든 핸들러가 호출되도록 보장 할 수 있음).
다른 팁
C#을 통해 Jeffrey Richter의 CLR에서 비슷한 것을 기억하는 것 같습니다. 편집하다: 나는 그가 그것에 대해 자세히 설명한다는 것을 확실히 기억합니다.
이벤트 등록을 통제하는 데 몇 가지 다른 이유가 있습니다. 그중 하나는 수많은 이벤트가있을 때 코드 팽창을 줄이는 것입니다. 제프리 가이 책 안에서 이것에 대해 자세히 들어간 것 같아요 ...
- 아니
- 예를 들어, 핸들러 중 하나의 결과에 따라 통화 체인을 깨뜨려야 할 수도 있습니다. CustomeVentargs 객체에 '차단 된'속성이 있다고 가정 해보자 모든 추가 이벤트 핸들러 호출을 진정으로 억제합니다.
제휴하지 않습니다 StackOverflow