下面是转载的一篇文章。但是,自己尝试的时候,发现直接调用invokeFun()函数也是可行的。作者的文章是06年的,可能比较早,此间C#已经经过一些版本的更新。
一般来说,直接在子线程中对窗体上的控件操作是会出现异常,这是由于子线程和运行窗体的线程是不同的空间,因此想要在子线程来操作窗体上的控件,是不可能简单的通过控件对象名来操作,但不是说不能进行操作,微软提供了Invoke的方法,其作用就是让子线程告诉窗体线程来完成相应的控件操作。
现在用一个用线程控制的进程条来说明,大致的步骤如下:
1. 创建Invoke函数,大致如下:
//被调用的委托函数
void invokeFun()
{
if (proBar.Value < 100)
{
proBar.Value += 1;
}
}
2. 子线程入口函数:
void _threadProc()
{
//定义委托对象,指定委托函数
MethodInvoker mi = new MethodInvoker(this.invokeFun);
for (int n = 0; n < 100; n++)
{
//委托对象执行
mi.Invoke();
Thread.Sleep(100);
}
}
3. 创建子线程:
Thread newThread = new Thread(new ThreadStart(_formThreadProc));
newThread.Start();
知识补充:
MethodInvoker表示一个委托,该委托可执行托管代码中声明为 void 且不接受任何参数的任何方法。