2009-11-27 103 views
1

我使用system.timers.timer作爲我的服務。如何從System.Timers.Timer訪問窗體控件​​(交叉線程問題)

現在我構建一個測試表單,我也可以使用它。在timer_Elapsed事件中,我做了一些工作並希望停止它需要的計時器(xxx ms)並將其寫在窗體控件上以顯示。

但是,當我訪問列表視圖,我得到一個交叉線程錯誤。

任何想法?

回答

1

如果要從主UI線程以外的線程訪問控件,則需要在要訪問的控件上使用Invoke方法。

+0

謝謝,但我從來沒有使用過這個,你能舉個例子/一個教程嗎? – Kovu 2009-11-27 17:35:13

+0

http://msdn.microsoft.com/en-us/library/system.windows.forms.control.invokerequired.aspx 底部有一個代碼示例。 – David 2009-11-27 17:44:06

1

你的方法應該是這樣的:

public void foo(int value, string message) 
    { 
     if (InvokeRequired) 
     { 
      BeginInvoke(new Action<int, string>(foo), value, message); 
     } 
     else 
     { 
      // Stop the timer 
     } 
    } 
1

當使用System.Timers.Timer,使用計時器的SynchronizingObject屬性。顯然,這會導致處理Elapsed事件的方法在創建分配組件(SynchronizingObject)的同一線程上被調用。 例如。如果myButton爲你的窗體上的控件(無論主界面線程),

System.Timers.Timer myTimer = new System.Timers.Timer(); 
myTimer.SynchronizingObject = this.myButton; 

這將導致經過的處理程序在同一線程上運行,刪除一些「跨線程操作」的錯誤。

請注意:我對這是否是線程安全的知識知之甚少,但在特定用例中對我工作良好。無論如何希望它有幫助。