在一个应用程序中,往往存在两种线程:UI线程和工作线程。
UI线程有窗口,创建窗口的控件,且有消息队列对窗口和控件的消息进行管理。主要处理和UI相关的逻辑。
工作线程主要处理和业务相关的比较复杂的逻辑,当处理好之后有可能会调用UI线程中的控 件将结果在UI界面上展现出来。
那么到这里,就出现了跨线程调用UI控件方法的问题。在工作线程中可以直接调用UI上的控件的方法吗?显然不行。代码能编译,在运行时会报错。
怎么解决这个问题呢?
每个控件都有一个属性:InvokeRequired,该属性值为true的场合,表示:调用方是跨线程调用该控件,那么就需要调用该控件的invoke方法执行相关方法来实现逻辑。该属性值为false的场合,表示调用方为UI线程,那么可以直接调用控件方法或者改变该控件的属性值。
例:
if (textBox.InvokeRequired)
{
textBox.Invoke(new Action<string>(str =>
{
textBox.Text += str;
}), logStr);
}
else
{
textBox.Text += logStr;
}