在實作時,發現這個現象,請教各位大大,這當中的原理.
謝謝~
set控制項
private System.Timers.Timer _TimersTimer;
private void Timer22_f_Load(object sender, EventArgs e)
{
this._TimersTimer = new System.Timers.Timer();
this._TimersTimer.Interval = 100;
this._TimersTimer.Elapsed += new System.Timers.ElapsedEventHandler(_TimersTimer_Elapsed);
this._TimersTimer.Start();
}
void _TimersTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
label1.Text = (int.Parse(label1.Text) + 1).ToString();
}
出現錯誤訊息 : 跨執行緒作業無效: 存取控制項 'label1' 時所使用的執行緒與建立控制項的執行緒不同。
但如果不要存,只有取的話,卻可以.
為什麼會這樣呢?
void _TimersTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
int iTest = (int.Parse(label1.Text) + 1);
Console.WriteLine(iTest);
}
因為 System.Timers.Timer 的 Elapsed 事件是在非 UI 執行緒上觸發的。
因此,您不能直接存取或更新 UI 控制項,否則將產生錯誤。
解決方法是將存取控制項的代碼放在 Control.Invoke 或 Control.BeginInvoke 方法中,這些方法會將程式碼包裹在 UI 執行緒上,以避免跨執行緒錯誤。
void _TimersTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
label1.Invoke((MethodInvoker)delegate {
label1.Text = (int.Parse(label1.Text) + 1).ToString();
});
}