2014-02-11 13 views
0

在控制檯應用程序中,我們該如何做一個System.Timers.Timer在主線程中調用Elapsed事件的「簡單」問題?c# - System.Timers.Timer主線程上已經發生的事件

我讀過一些關於SyncronizingObject屬性的內容,但是目前我還沒有嘗試實現一個實現ISyncronizeInvoke接口的類。

編輯(澄清):

我試圖模擬一個典型的事件模型。我有一些代碼使用基於事件的方法監視某些設備的狀態。問題是一些設備不使用事件發送狀態,並要求應用程序輪詢數據。

找到的解決方案是使用計時器並輪詢設備。如果發現任何變化,那麼我們會提出類似的現有事件。

問題是遺留代碼遠離線程安全,並且適應它將是一個不小的任務。

也許有更好的方法。

+1

爲什麼需要在主線程上執行?是否只是希望主線程等待,直到事件發生後? – Sacrilege

+0

你的主線程在做什麼?WinFoems,WPF或可能是服務的一部分? –

+0

它是服務的一部分。 – TiagoOliveira

回答

3

您的主線程需要首先具有某種類型的消息循環,並將消息發送到該消息循環的機制。如果你使用的是桌面UI環境,例如winforms,WPF等,這將會爲你創建,但由於你不是,你需要自己創建一個。

消息循環,在它的最靈長類動物的水平,看起來是這樣的:

while(!ShouldApplicationExit()) 
{ 
    var nextMesage = someQueueOfMessages.Dequeue(); 
    nextMessage(); 
} 

那麼你當然需要公開某種方式爲人們的信息添加到隊列中,表明潛在的一些方法應用程序應該在某個時候退出。如果沒有物品,您的隊列也應該阻止,而不是崩潰和燃燒。

如果你願意,你可以自己做所有這些。除非它特別花哨,否則不是那麼耗時。

其他選擇是使用其他的東西來創建消息循環,如Application.Run,這將在內部有一個循環,看起來有點不像我所展示的,在引擎蓋下。

一旦你創建或決定了你的消息泵的實現,你就可以得到一些向泵添加新消息的機制。這就是你需要在你的ISyncronizeInvoke執行內部做的事情,呼籲那個機制。

+0

我設法以不同的方式解決問題,但由於這是解決問題的最接近的解決方案,因此我會將此答案標記爲已接受。 – TiagoOliveira

0

System.Timers.Timer可用於觸發事件,如果您很高興在系統池的線程上引發事件。

如果你需要有更多的控制控制檯應用程序定時回調,您可以CreateThread自己額外的線程,有這個WaitForSingleObject和有事件中斷前臺任務在運行時。

請參閱.Net Timeouts: WaitForSingleObject vs Timer進行類似的討論。