2016-04-24 98 views
1

我需要在Windows窗體應用程序中掛鉤消息循環以執行一些滴答計數相關的工作。在Windows窗體應用程序中掛鉤消息循環?

我正在開發一個使用異步方法(異步/等待)的tcp服務器,我避免處理多線程過程中的競爭條件 - 這基本上是我使用async/await而不是其他方法楷模。由於這個限制,我不能創建一個後臺線程來執行計數器計數,因爲在這種情況下,我將以多線程代碼結束。

我認爲一個選項是以某種方式將消息循環連接到Windows窗體中,因此我可以使用Windows窗體對象的相同線程輕鬆地完成與滴答相關的東西,儘管我沒有找到任何合適的方法或事件在Windows.Forms.Application類中。

任何人都知道一種方法來做我所需要的?

謝謝。

+0

異步/等待是多線程... –

+0

你好。 @GlenThomas。我知道async/await是多線程的,但是這個模型中的多線程只能在較低層次上運行。我在UI線程中使用async/await寫入的所有代碼都將在UI線程中執行。 – ptr0x

+0

異步代碼將不會在UI線程中運行 –

回答

2

我覺得你最好的辦法可能是使用一個計時器,它會在固定的時間間隔執行代碼:

var aTimer = new System.Timers.Timer(); 
aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent); 
aTimer.Interval = 5000; 
aTimer.Enabled = true; 



// What you want to happen when the Elapsed event is raised. 
private static void OnTimedEvent(object source, ElapsedEventArgs e) 
{ 
    // Do something 
} 
+0

只是附錄:如果您需要定時器的回調在特定的SynchronizationContext中執行,請設置Timer.SynchronizingObject! – ptr0x

1

你不會想重寫消息循環。在更加簡單的GUI解決方案中,這是一種非常常見的方法,但它實際上是.NET上的最後一種方法。

既然你只是想要一個定期的「勾號」,最合適的解決方案是一個計時器。既然你想讓它在UI線程上運行,你應該使用System.Windows.Forms.Timer

+0

你好斯蒂芬!我最終使用System.Timers.Timer,因爲我需要在沒有任何「UI層」依賴的程序集中聲明這個定時器。此外,我正在使用的計時器有可能在特定的同步上下文中運行回調。 – ptr0x