摘要:如何跨執行緒存取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 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 }
之後需要改任何控制項的文字 (i.e Text 屬性) 就直接叫用 UpdateUI 就好了,跨執行緒存取也不會有問題。