我使用system.timers.timer作爲我的服務。如何從System.Timers.Timer訪問窗體控件(交叉線程問題)
現在我構建一個測試表單,我也可以使用它。在timer_Elapsed事件中,我做了一些工作並希望停止它需要的計時器(xxx ms)並將其寫在窗體控件上以顯示。
但是,當我訪問列表視圖,我得到一個交叉線程錯誤。
任何想法?
我使用system.timers.timer作爲我的服務。如何從System.Timers.Timer訪問窗體控件(交叉線程問題)
現在我構建一個測試表單,我也可以使用它。在timer_Elapsed事件中,我做了一些工作並希望停止它需要的計時器(xxx ms)並將其寫在窗體控件上以顯示。
但是,當我訪問列表視圖,我得到一個交叉線程錯誤。
任何想法?
如果要從主UI線程以外的線程訪問控件,則需要在要訪問的控件上使用Invoke方法。
你的方法應該是這樣的:
public void foo(int value, string message)
{
if (InvokeRequired)
{
BeginInvoke(new Action<int, string>(foo), value, message);
}
else
{
// Stop the timer
}
}
當使用System.Timers.Timer,使用計時器的SynchronizingObject
屬性。顯然,這會導致處理Elapsed事件的方法在創建分配組件(SynchronizingObject)的同一線程上被調用。 例如。如果myButton爲你的窗體上的控件(無論主界面線程),
System.Timers.Timer myTimer = new System.Timers.Timer();
myTimer.SynchronizingObject = this.myButton;
這將導致經過的處理程序在同一線程上運行,刪除一些「跨線程操作」的錯誤。
請注意:我對這是否是線程安全的知識知之甚少,但在特定用例中對我工作良好。無論如何希望它有幫助。
謝謝,但我從來沒有使用過這個,你能舉個例子/一個教程嗎? – Kovu 2009-11-27 17:35:13
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.invokerequired.aspx 底部有一個代碼示例。 – David 2009-11-27 17:44:06