2016年8月28日 星期日

C# Winform 跨執行緒控制項作業 ( Cross thread UI Update)

當執行Windows Form程式和WPF 等UI form程式時

很常遇到 "跨執行緒作業無效: 存取控制項'ListItem'  " 類似的問題。


以下是理解後的說明:
1. 主控制項的執行緒不允許給子執行緒做存取,這會違反設計模式的封裝架構

2. 在編譯時能正常通過,表示微軟有提供可以走後門的方式Cross thread ui 程式碼如下:
Form.CheckForIllegalCrossThreadCalls = false; 

3. 一個符合安全的設計模式的跨執行緒程式碼如下:
        private void SetReturnValueCallbackFun(ref ListViewItem node, ExchangeData Data)
        {
            try
            {

                if (this.AllInfomation_listView_Service.InvokeRequired)
                {
                    this.AllInfomation_listView_Service.BeginInvoke((MethodInvoker)delegate () { this.AllInfomation_listView_Service.Items[0].SubItems[3].Text = Data.Text; ; });
                }
                else
                {
                    this.AllInfomation_listView_Service.Items[0].SubItems[3].Text = Data.Text;
                }
                //  AllInfomation_listView_Service.Items[0].SubItems[4].Text = Data.Text;
            }
            catch (Exception ex)
            {

            }

        }


當if (this.AllInfomation_listView_Service.InvokeRequired) 為true 時,表示不同執行緒,要透過委派的方式更新主執行緒的控制項資料。
否則當然就是同個執行緒所以可以執行存取控制項的值
※這是屬於匿名委派

4.以下是我的參考資料連結:

沒有留言:

張貼留言