2010-11-21 68 views
0

我正在處理一個事件處理代碼的項目。基本上,我創建了一個計時器,然後使用我自己的事件處理程序處理超時事件。我通過在那裏放置一個斷點進行雙重檢查,是的,事件處理程序確實被添加到該事件中(是的,我也啓動了計時器)。但是,出於某種原因,事件處理程序有時會觸發,而其他時間則不會。我正在使用多線程,並認爲它可能與此有關,但我不確定。事件處理程序有時不會觸發C#

我知道這是一個模糊的問題,但希望有人碰到類似的東西。

感謝,

PM

編輯:我看着這個問題遠一點,我注意到,這的確是一個線程的問題。負責這個事件的線程是處理我的程序的網絡部分的線程,並且它在之後立即被阻塞,因爲它正在等待來自網絡上另一個程序實例的輸入。我將如何解決這個問題?

+0

什麼時間有超時事件? – Joey 2010-11-21 23:17:23

+0

完整性檢查:你什麼時候開始('myTimer.Start()')你的計時器,並且你確定它是在你期望事件觸發時開始的? – MPelletier 2010-11-21 23:18:43

+0

@Joey:我想OP的意思是'Elapsed'。 – MPelletier 2010-11-21 23:19:45

回答

2

我已經調查了一下這個問題,我注意到這確實是一個線程問題。負責這個事件的線程是處理我的程序的網絡部分的線程,並且它在之後立即被阻塞,因爲它正在等待來自網絡上另一個程序實例的輸入。我將如何解決這個問題?

聽起來你的(a)有一個SynchronizingObject集到UI控制一個System.Windows.Timers.Timer,或正在使用(b)一種System.Windows.Forms.Timer。然後,通過網絡讀取阻止UI線程 - 防止事件觸發。

您有2個選項,可以爲網絡讀取或定時器事件使用不同的線程。如果使用System.windows.Timers.Timer,則不要傳遞SynchronizingObject,並且它會在ThreadPool線程上引發事件。或者,async the network read

+0

問題解決了。我正在使用Windows.Forms.Timer。當我切換到System.Timers.Timer時,一切正常。謝謝! – user472875 2010-11-21 23:37:30

+0

順便說一句,有沒有辦法在ThreadPool線程上提出我自己的自定義事件,就像Timer一樣,而不是阻塞? – user472875 2010-11-21 23:57:26

+0

@ user472875 - 您可以使用ThreadPool.QueueUserWorkItem並以這種方式提升您的事件。或者,循環遍歷每個委託並調用BeginInvoke。 – 2010-11-22 17:04:49

0

它是什麼類型的計時器,你有沒有參考它?計時器是否有可能在火災發生前被垃圾收集?在System.Windows.Timers.Timer的文檔中有關於此的警告。

+0

我已將GC.KeepAlive添加到兩個計時器,但沒有結果。我幾乎肯定會發生此問題,因爲創建計時器的線程會立即執行後面的塊。 – user472875 2010-11-21 23:28:36

相關問題