Microsoft MVP성태의 닷넷 이야기
이벤트 핸들러와 쓰레드의 관계 2 [링크 복사], [링크+제목 복사],
조회: 12881
글쓴 사람
임동찬 (techsharer at outlook.com)
홈페이지
첨부 파일

아래 답변 감사드립니다.
링크 주신 게시글 보며 확인해봤는데
아래 두가지 점에 대해 궁금합니다.

1. 첫번째 링크의 예제에서 이벤트를 2개 아닌 1개만 등록시키면,
   watch창에서 _invocationCount가 1이 아닌 0으로 나오네요?
   reflection을 통해서는 1개 등록시에도 잘 나오구요.
   (.net framework 내부에서 2개 이상일때만 _invocationList를 통해 관리하는 건지...?)

2. 위와 같이 테스트 해도 원래 질문은 해결되지 않네요.
   첨부파일은 첫번째 링크 예제에 event를 주기적으로 fire시키도록 추가한 예제인데,
   실제 디버그모드에서 thread 창을 열어두고 계속 핸들러쪽으로 브레이크 포인트 잡아보면,
   하나의 worker 쓰레드가 아닌 여러개(보통 3개 내외) 쓰레드에서 핸들러가 실행됨을
   확인할 수 있습니다. 왜 그럴까요? 알려주신 방법으로는 명확하게 1개의 구독자만 등록됨을
   확인할 수 있지만 쓰레드는 왜 여러개에서...?








[최초 등록일: ]
[최종 수정일: 1/13/2010]


비밀번호

댓글 작성자
 



2010-01-13 11시34분
[임동찬] 첨부가 안되네요. 저희쪽 문제인듯. 메일로 보냅니다.
[guest]
2010-01-13 07시48분
1. 넵. 한개일 때는 단순히 delegate 변수에 대입해서 처리하는 것 같고, 2개 이상일 때에만 리스트로 관리하는 것 같습니다.
2. 보내주신 예제에서는 여러 개의 쓰레드에서 무작위로 실행되는 것이 맞습니다. 왜냐 하면 Systerm.Timers.Timer 는 내부적으로 쓰레드 풀의 쓰레드를 이용해서 이벤트 핸들러를 호출하기 때문입니다. 만약, UI 쓰레드에서 이벤트 핸들러가 실행하도록 하고 싶다면 System.Windows.Forms.Timer 를 이용하시면 됩니다.
kevin25
2010-01-13 08시19분
[임동찬] 타이머 핸들러가 아닌 테스트 이벤트 핸들러가 그런데요??
[guest]
2010-01-13 10시29분
일반 핸들러가 fire 되는 코드가 timer 이벤트 핸들러 안에 있으니 마찬가지입니다.
timer 이벤트 핸들러가 쓰레드 풀로부터 선택된 쓰레드 위에서 실행되고 있고, 그 내부의 코드 역시 그 쓰레드가 실행하고 있으니까요. 이벤트 핸들러는 "단어" 자체가 이벤트 핸들러일 뿐 그냥 함수 호출이라고 보시면 됩니다. 즉,

private void tickTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
test.TestFire();
}

는,

private void tickTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
test_TestEvent(...);
}

라고 보시면 됩니다.
kevin25

1  2  3  4  5  6  7  8  [9]  10  11  12  13  14  15  ...
NoWriterDateCnt.TitleFile(s)
5730김재환10/7/20224642WPF에서 디스플레이 배율이 100%가 아닌 경우, Window의 포지션 정보가 부정확해지는 문제 [2]
5729김기헌10/2/20224319안녕하세요 선생님 뮤텍스 관련 질문 드립니다 [2]
5728김경환9/29/20224381그리드뷰관련마지막질문하나드리겠습니다선생님 [5]파일 다운로드1
5727김경환9/26/20224289c# 윈폼 tcp/ip 기반 데이터그리드뷰질문하나드리겟습니다 [3]
5726양승조 donator9/22/20225025C# dll 과 C++ 간 배열 전달. SafeArray [10]파일 다운로드1
5725김기헌9/21/20223895안녕하세요 선생님 윈폼 컨트롤 Dispose 관련 질문드립니다 [2]
5724감사합니...9/19/20223923스레드와 스레드 안전한 객체 사용관련 문의드립니다. [5]
5723드리렁9/13/20223850Pinned Object에 대해서 질문이 있습니다. [2]
5722김인태9/8/20224017대화상자에서 alt + tab 후킹 작업 [1]
5721우종9/7/20224187C++ DLL 과 C# 연동 문의 [2]
5720한예지 donator9/6/20223869학습 방법 질문 있습니다. [7]
5719김경한9/6/20224203안녕하세요 질문하나만드리겠습니다...! [10]
5718김민아9/2/20224261안녕하세요 생성자 호출 시 초기화 순서 질문드립니다 [2]
5716iili...8/26/20224424WinDbg 커널 디버깅에서의 thread freeze [2]
5715에릭8/19/20224855WMI 쿼리 결과값이 Windows Service와 Console 출력에서 상이한 이유가 있을까요? [9]파일 다운로드1
5714허니빠8/18/20224886.net6 hint path 를 프로젝트 단위로 지정할 수 있는 방법을 알고싶습니다 [8]
5713김기헌8/17/20224815안녕하세요 rgb 계산 오차가 있는데 원인을 모르겠습니다.. [3]
5712하태8/17/20224268안녕하세요 background service에서 user32dll 접근 질문 드리겠습니다.! [2]
5711하태8/16/20223766안녕하세요! 윈도우즈 해상도 관련 질문 드립니다. [1]
5710장성욱8/12/20223983c# 시리얼 통신 관련 질문 [3]
5709초보8/12/20223789WPF 커맨드 관련 질문 [2]
5708민성8/11/20224058안녕하세요 c#에서 화면의 배율 및 레이아웃을 변경할려면 어떻게 해야 할까요? [2]파일 다운로드1
5707민성8/10/20223703WPF 엣지 컨트롤에서 화면이 안보이는 현상 [2]파일 다운로드1
5706종규8/7/20226148WPF 에서 SVG 아이콘 사용 방법 문의 [2]
5705김기헌8/6/20224831안녕하세요 선생님 싱글톤 패턴 간단 질문 [2]
5704따봉이8/4/20224716EventHandler 관련 [1]
1  2  3  4  5  6  7  8  [9]  10  11  12  13  14  15  ...