最近在修改自動化小工具,用多線程來解決後臺拷貝導致WinForm界面卡死的情況,但是遇到過錯:線程間操作無效: 從不是創建控制項“dataGridView”的線程訪問它。 這是因為在多線程程式中,新創建的線程不能訪問UI線程創建的視窗控制項,如果需要訪問視窗中的控制項,有2種解決方法: 1. 在Form_ ...
最近在修改自動化小工具,用多線程來解決後臺拷貝導致WinForm界面卡死的情況,但是遇到過錯:線程間操作無效: 從不是創建控制項“dataGridView”的線程訪問它。
這是因為在多線程程式中,新創建的線程不能訪問UI線程創建的視窗控制項,如果需要訪問視窗中的控制項,有2種解決方法:
1. 在Form_Load中添加:
//取消跨線程檢查 Control.CheckForIllegalCrossThreadCalls = false;
這樣進行非安全線程訪問時,運行環境就不去檢驗它是否是線程安全的。
但是不推薦這種方法!!!
2. 利用委托機制實現線程安全。
就是將你所要操作的代碼放到一個代理中,然後將這個代理交給創建這個控制項的線程來執行你的代碼。
//聲明委托: private delegate void DelegateDataGridViewWRLUI(); //使用委托在多線程中執行: DelegateDataGridViewWRLUI delegateDataGridViewWRLUI = delegate { this.dataGridViewWRL.DataSource = dataList; this.dataGridViewWRL.Refresh(); this.dataGridViewWRL.EditMode = DataGridViewEditMode.EditOnEnter;//滑鼠單擊編輯 this.dataGridViewWRL.RefreshEdit(); this.dataGridViewWRL.Columns[1].Frozen = true; //固定左側2列 }; this.dataGridViewWRL.Invoke(delegateDataGridViewWRLUI);