【C#】Invoke 和 InvokeRequired,线程安全

    xiaoxiao2023-10-12  163

    如果在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(); }
    最新回复(0)