欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C#: 线程间操作无效: 从不是创建控件“dataGridView”的线程访问它

程序员文章站 2022-12-16 23:15:15
最近在修改自动化小工具,用多线程来解决后台拷贝导致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);