摘要:如何跨執行緒存取UI - WinForm
寫一支Windows Form AP,此程式支援多執行緒,但遇到一個問題,
其他執行緒要存取其他UI會出錯,如以下錯誤資訊:
跨執行緒作業無效: 存取控制項 'textBox1' 時所使用的執行緒與建立控制項的執行緒不同。
怎麼解決這個問?找到兩個方法,第一個比較簡單直接針對Form作屬性設定即可,但較不安全。
1
Form.CheckForIllegalCrossThreadCalls = False

第二個方法比較正統,寫的程式比較多,採委派方式。
01
private delegate void UpdateUICallBack(string value, Control ctl);
02
private void UpdateUI(string value, Control ctl)
03
{
04
if (this.InvokeRequired) {
05
UpdateUICallBack uu = new UpdateUICallBack(UpdateUI);
06
this.Invoke(uu , value, ctl);
07
}
08
else {
09
ctl.Text = value;
10
}
11
}

02

03

04

05

06

07

08

09

10

11

之後需要改任何控制項的文字 (i.e Text 屬性) 就直接叫用 UpdateUI 就好了,跨執行緒存取也不會有問題。