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