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

如果在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();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值