簡體   English   中英

c#-主線程上的System.Timers.Timer經過事件

[英]c# - System.Timers.Timer Elapsed event on main thread

“簡單”問題,在控制台應用程序中,我們如何在主線程中調用System.Timers.Timer Elapsed事件?

我已經閱讀了有關SyncronizingObject屬性的內容,但是,目前我在嘗試實現實現ISyncronizeInvoke接口的類方面沒有任何成功。

編輯 (為澄清):

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

找到的解決方案是使用計時器並輪詢設備。 如果檢測到任何變化,那么我們將引發與現有變化類似的事件。

問題在於,遺留代碼遠非線程安全的,對其進行調整將是一個艱巨的任務。

也許有更好的方法。

您的主線程首先需要具有某種消息循環,以及將消息發送到該消息循環的機制。 如果您在桌面UI環境(例如winforms,WPF等)中,則將為您創建該環境,但由於並非如此,因此您需要自己創建一個。

在最原始的級別上,消息循環看起來像這樣:

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

然后,當然,您需要公開一些方法供人們將消息添加到該隊列中,還可能需要某種方式來指示應用程序應在某個時刻退出。 如果沒有項目,您的隊列也應該阻塞,而不是崩潰和燃燒。

如果需要,您可以自己完成所有這些操作。 除非需要特別花哨,否則並不需要所有的時間。

其他選擇是使用其他東西來創建消息循環,例如Application.Run ,它將在內部具有一個類似於我在后台顯示的循環。

一旦創建或決定了消息泵的實現,您就會獲得一些向泵添加新消息的機制。 那就是您需要在ISyncronizeInvoke實現內部執行的操作,並調出該機制。

如果您願意在系統池的線程上引發事件,則可以使用System.Timers.Timer觸發事件。

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

有關類似的討論,請參見.Net超時:WaitForSingleObject與計時器

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM