先说笔者遇到这个报错信息的背景。笔者开多线程读取数据,在新的线程中调用函数直接对TextBox进行刷新,就会报此错误。
原因即是我们创建TextBox的进程称为主线程的话,另外开设的线程即为分线程,不同线程创建的东东不能跨线程操作。遇到这种情况,推荐的方法是用代理。代理也是C#一个安全的指针。
代理或者叫做委托,英文都是delegate,用法比较简单。比如我们先定义一个显示函数,向TextBox中添加字符串。如下,函数写在了main.cs中
然后我们声明代理,要求代理的返回值为void类型,同时输入参数和其想代理的函数的输入参数一样,比如我们的AddTxt的参数为(string txt),则我们的代理也需要是string类型
如下:
接下来我们在线程中声明代理的一个对象即可,如下,语句写在了想直接刷新ListView的线程中。
接着在想调用对TextBox刷新的地方,也就是想用AddTxt函数的地方(注意直接在线程中用AddTxt就会报题目所说的错误),改为如下函数
BeginInvoke是System.Windows.Forms的中的函数,是系统自己的,用法就是调用代理时,前面的参数是代理对象,后面是传入的参数。
运行下,无报错,成功