當執行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.以下是我的參考資料連結: