2012-01-30 52 views
0

我有C#窗體窗體應用程序,用於查詢來自連接設備的數據。我現在啓動一個System.Timer.Timer,它被設置爲每隔20ms觸發一次,並從連接的工具中獲取數據。這工作正常,但當然UI變得對數據計數的更新,數據計算的最終結果等等沒有響應。我也在一些OpenGL窗口中顯示數據,所以有很多事情要做。Windows窗體訪問設備數據的響應式UI

_timer1 = new System.Timers.Timer{ 
Interval = Convert.ToDouble(txtElapse.Text), 
Enabled = true};  
_timer1.Elapsed += Timer1Elapsed; 

然後,我使用無效的形式重繪的OpenGL,這就是所有我的計算等等被執行。

我的問題是關於線程,基本上是在什麼時候,或者我應用線程邏輯到什麼對象?計時器本身?如果我這樣做,我無法調試,它只是坐在那裏。我已經做了大量與ThreadPools,Backgroundworker,Thread等相關的研究,但對於這種情況沒有任何作用,因爲我相信(錯誤地?)計時器在默認情況下在其自己的線程上運行。

回答

1

一個很好的經驗法則是任何需要更長時間或可能需要超過50ms的應該是異步的。您的多線程選項取決於您使用的目標框架,因爲在.NET 2-3.5中,您具有標準的異步模式(開始,結束,調用,回調),但在.NET 4中有任務並行庫。

BackgroundWorker 用於異步操作的包裝器。所以它會適合您的操作賬單。考慮到你說過你已經做了大量的研究,我不會去那裏看細節。

您也可以分離一個線程,並執行thread-safe invokes到用戶界面。

public void StartFooAsync() { 
    Thread thread = new Thread(new ThreadStart(DoFooAsync)); 
    thread.IsBackground = true; 
    thread.Start(); 
} 

private void DoFooAsync() { 
    while (m_Running) { 
     // Do something 
     Thread.Sleep(20ms); // Make the thread wait your 20ms 
    } 
} 

您還可以使用Task Parallel Library in .NET4