如何跨執行緒存取UI - WinForm

摘要:如何跨執行緒存取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 }

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