最近在修改自动化小工具,用多线程来解决后台拷贝致使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);