如果在winform构建的GUI界面,通过事件响应函数改变控件的状态(比如某个按钮文本为“Open”,单击之后需要显示“Close”),需要在控件响应函数中调用控件的Invoke方法。
因为存在一种可能: 如果控件是在主线程创建,进入控件的事件响应函数是在控件所在的线程,而不是主线程。则当在事件响应函数中改变控件的状态,可能与主线程发生线程冲突。
C#中是禁止跨线程直接访问控件的,可以使用控件的InvokeRequired
属性检查,如果为true,则需要通过Invoke
方法对控件进行调用。
如果从线程外操作windows窗体控件,那么就需要使用Invoke
或者BeginInvoke
方法,通过一个委托把调用封送到控件所属的线程上执行。
public void DisplayTime(double time)
{
InvokeIfRequired(() => // Lambda 表达式
{
timePanel.Text = "Time : " + time.ToString("F3");
timePanel.Visible = true;
});
}
private void InvokeIfRequired(MethodInvoker _delegate)
{
if (statusStrip1.InvokeRequired)
statusStrip1.BeginInvoke(_delegate);
else
_delegate();
}