2009-08-06 74 views
1

我在C#中遇到接口滯後的問題。如何減少C#中的接口延遲?

由於我還在學習,請耐心等待我解釋。

我已經縮小了我的計時器對象的問題。

基本上我的程序通過TCP/IP套接字查詢設備並將其輸出到屏幕上的文本框。

現在我進行輪詢,這需要一些邏輯被埋沒計時器對象內數據的每個第二裝置和以下是蜱之間會發生什麼:

  1. 遞增的值。
  2. 構建2個字符串表示命令要被髮送到 盒子(封裝在功能
  3. 編碼命令
  4. 發送命令
  5. 清除字節數組
  6. 接收應答。

這可能是在事件處理程序中做了太多的處理嗎?每當我在輪詢會話期間嘗試移動窗口時,即定時器運行時,我都會遇到非常糟糕的輸入延遲

+0

謝謝大家的回覆。它讓我讀了一大堆讓我頭痛的文章,但給了我一個關於這裏發生的事情的粗略圖片; – 2009-08-06 03:04:36

回答

11

您正在使用的計時器正在windows消息線程上執行。因此,輪詢正在運行時,Windows消息隊列被阻止。這並不是一個執行太多處理的問題,大部分時間線程將等待TCP/IP響應。

爲了解決這個問題,你只需要做後臺線程的工作,然後在UI線程上更新UI。

.NET框架中有一堆不同的定時器,它們以不同的方式工作,您正在使用的作品在同一個線程上處理定時器事件,其他定時器在後臺線程上工作。 Check this article out about the different timers

您也可以使用您當前的計時器來調用BackgroundWorker組件來完成後臺線程的工作。這樣做的主要好處是BackgroundWorker將在後臺線程上完成工作,但會在UI線程上引發工作完成事件,以便更新UI而不必擔心所處的線程。

+0

我現在已經嘗試了每種方法(BackgroundWorker,單獨的線程),但無論我做什麼我的UI仍然在投票期間持有人質,在大多數情況下,我甚至無法中斷輪詢過程(除非我睡覺工作線程)我現在在如何實現這個邏輯的損失。 – 2009-08-09 06:29:17

1

看起來好像有一些事情正在進行。首先,你可能在你的計時器滴答處理器中做得太多。你如何構造字符串並對命令進行編碼?這些都可以在tick處理程序之外完成,或者以任何方式進行簡化(例如使用String.Format調用)?在.NET中實際上有三種不同的計時器,具有不同的分辨率。你正在使用哪個計時器?

最大的問題是你的間隔是1秒。無論如何,這是很多處理開銷。請記住,大多數情況下,每次間隔被擊中並且調用滴答處理程序時,都會導致線程之間的上下文切換。在這方面有一些額外的開銷(你可以做任何事情都沒有),而且你的上下文切換越頻繁,你的表現就越慢。

2

我認爲這是因爲你試圖在你的UI線程中工作。讓你的計時器在後臺工作線程中運行。