最近在修改自動化小工具,用多線程來解決後臺拷貝致使WinForm界面卡死的狀況,可是遇到過錯:線程間操做無效: 從不是建立控件「dataGridView」的線程訪問它。安全
這是由於在多線程程序中,新建立的線程不能訪問UI線程建立的窗口控件,若是須要訪問窗口中的控件,有2種解決方法:多線程
1. 在Form_Load中添加:工具
//取消跨線程檢查 Control.CheckForIllegalCrossThreadCalls = false;
這樣進行非安全線程訪問時,運行環境就不去檢驗它是不是線程安全的。this
可是不推薦這種方法!!!spa
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);