使用invoke方法解决跨线程访问的问题

C#中禁止跨线程直接访问控件,InvokeRequired是为了解决这个问题而产生的,当一个控件的InvokeRequired属性值为真时,说明有一个创建它以外的线程想访问它。
获取一个值,该值指示调用方在对控件进行方法调用时是否必须调用 Invoke 方法,因为调用方位于创建控件所在的线程以外的线程中。
如果从另一个线程调用控件的方法,那么必须使用控件的一个 Invoke 方法来将调用封送到适当的线程

当点击“button2”的时候,通过另外一个线程btn2改变label的值,但是btn2线程通过invoke方法执行,此时,便不会报告错误,即使在button2的click事件中多次调用线程,也不会出错,当点击按钮,系统知道是跨线程调用,则用invoke方法(委托)来执行方法,便不会出错解决了问题;
参考博文:
https://blog.csdn.net/qq_39217004/article/details/105439971

 if (this.InvokeRequired)
 {
      this.Invoke(new dTest(test));
 }

public Form1()
{
    InitializeComponent();
}
private Thread btn1;
private Thread btn2;


// 模拟一个实际应用
// 对label1赋值后立马检查他的值,如果已经被改过则抛出异常 
void test()
{
    try
    {
        string strText = Guid.NewGuid().ToString();//随机生成一串字符
        this.label1.Text = strText;//改变label.Text的值
        if (this.label1.Text != strText)
        {
            MessageBox.Show("label1的值意外改变", "错误提示");
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message, "跨线程访问错误提示");
    }
}

// 使用invoke方法 
public delegate void dTest();
void invokeThread()
{
    for (int i = 0; i < 102; i++)
    {
        if (this.InvokeRequired)
        {
            this.Invoke(new dTest(test));
        }
        else
        {
            test();
        }
        Thread.Sleep(10);
    }
}
// 通过invoke方法,在主线程排队,lable1的值在test函数体内永远是线程安全的. 
private void button2_Click(object sender, EventArgs e)
{
    btn2 = new Thread(new ThreadStart(invokeThread));
    btn2.Name = "通过invoke方法";
    btn2.Start();
    btn2 = new Thread(new ThreadStart(invokeThread));
    btn2.Name = "通过invoke方法";
    btn2.Start();
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

积跬步、至千里

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值