2010-11-21 5 views
0

일부 이벤트 처리 코드로 프로젝트 작업 중입니다. 기본적으로, 나는 타이머를 생성 한 다음 타임 아웃 이벤트에 대한 내 자신의 이벤트 핸들러를 집어 넣습니다. 나는 거기에 브레이크 포인트를 두어 두 번 확인했다. 예, 이벤트 핸들러는 그 이벤트에 추가된다 (그렇다, 나는 또한 타이머를 시작한다). 그러나 어떤 이유로 이벤트 처리기가 작동하지 않는 경우가 있습니다. 멀티 스레딩을 사용하고 있으며 어떻게 든 관련이있을 수 있지만 확실하지 않다고 생각했습니다.가끔 이벤트 핸들러가 실행되지 않습니다. C#

나는이 질문이 모호하다는 것을 알고 있지만 누군가가 비슷한 것을 만나기를 희망합니다.

감사합니다,

오후

편집 : 나는 조금 더 문제로보고 있고, 나는 이것이 참으로 스레드 문제가 있음을 알 수 있습니다. 이 이벤트를 담당하는 스레드는 내 프로그램의 네트워크 부분을 처리하는 스레드이며 네트워크에서 프로그램의 다른 인스턴스로부터의 입력을 기다리고 있으므로 즉시 중단됩니다. 이 문제를 어떻게 해결할 수 있을까요?

+0

어떤 타이머에 시간 초과 이벤트가 있습니까? – Joey

+0

온 전성 체크 : 타이머를 언제 시작 ('myTimer.Start()')하고 이벤트가 시작될 때 타이머가 시작되었는지 확인합니까? – MPelletier

+0

@ Joe : OP는 '경과'를 의미하는 것 같습니다. – MPelletier

답변

2

문제를 조금 더 살펴본 결과, 이것이 실제로 스레드 문제임을 알 수있었습니다. 이 이벤트를 담당하는 스레드는 내 프로그램의 네트워크 부분을 처리하는 스레드이며 네트워크에서 프로그램의 다른 인스턴스로부터의 입력을 기다리고 있으므로 즉시 중단됩니다. 이 문제를 어떻게 해결할 수 있을까요? 사용자가 (a)는 UI 제어에 SynchronizingObject 세트와 System.Windows.Timers.Timer 있고, 또는 (b)를 System.Windows.Forms.Timer를 사용하는 것처럼

소리. 그런 다음 네트워크 읽음으로 UI 스레드를 차단하여 이벤트가 실행되지 않도록합니다.

두 가지 옵션이 있습니다. 네트워크 읽기 또는 타이머 이벤트에 대해 다른 스레드를 사용하십시오. System.windows.Timers.Timer를 사용하는 경우 SynchronizingObject을 전달하지 마십시오. 그러면 ThreadPool 스레드에서 이벤트가 발생합니다. 또는 async the network read.

+0

문제가 해결되었습니다. Windows.Forms.Timer를 사용하고있었습니다. System.Timers.Timer로 전환하면 모든 것이 작동했습니다. 감사! – user472875

+0

BTW, 차단 대신 Timer가하는 것처럼 ThreadPool 스레드에서 내 자신 만의 맞춤 이벤트를 발생시킬 수 있습니까? – user472875

+0

@ user472875 - ThreadPool.QueueUserWorkItem을 사용하여 이벤트를 그렇게 높일 수 있습니다. 또는 각 대리인을 순환하고 BeginInvoke를 호출합니다. –

0

어떤 종류의 타이머이며, 그것에 대한 참조를 유지합니까? 화재로 인해 타이머가 가비지 수집 될 가능성이 있습니까? 문서에 System.Windows.Timers.Timer에 대한 경고가 있습니다.

+0

결과없이 GC.KeepAlive를 두 타이머에 모두 추가했습니다. 나는 거의 즉시 타이머 블록을 생성 한 스레드 때문에이 문제가 발생한다는 것을 확신합니다. – user472875

관련 문제