2010-04-18 70 views
0

我有一個自定義控件,其主要用途是繪製數據。我想爲控件添加一個ScheduleUpdate(int milliSeconds)方法,該方法將從現在開始強制更新X毫秒。Windows.Forms.Timer實例和UI線程

因爲這是所有的GUI土地,我應該使用Windows.Forms.Timer,但是這個計時器實例如何知道它屬於哪個線程?如果從非UI線程調用ScheduleUpdate()會怎麼樣?

我應該在Control構造函數中構造計時器嗎?或者可能是Load事件?或者是否可以安全地推遲構建,直到我進入ScheduleUpdate()?

我知道這裏面有一些非常類似的問題,但我的不是在我的控制器上有一個Timer組件,我在它需要的基礎上構建它。

回答

1

它知道,因爲它知道它創建在哪個線程上。有一個不可見的幫助窗口接收WM_TIMER消息,該消息又觸發Tick事件。該窗口具有線程相關性,線程上的消息循環將分派消息。這應該是你的應用的UI線程。

請確保您在與窗體及其控件相同的線程上創建此計時器。只需將它放在窗體上或者在窗體或控件構造器中創建它。然後您只需要將計時器的啓用屬性設置爲true即可。這是線程安全的,您可以在調度程序線程上執行此操作。