C#: 線程間操做無效: 從不是建立控件「dataGridView」的線程訪問它

最近在修改自動化小工具,用多線程來解決後臺拷貝致使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);
相關文章
相關標籤/搜索