【WinForm】线程间操作无效: 从不是创建控件的线程访问它

博客指出在加载耗时操作时,在线程中涉及UI控件会报错,如‘线程间操作无效: 从不是创建控件“textBox1”的线程访问它’。同时给出解决方法,一是不捕获对错误线程的调用,但此为非线程安全方式;二是使用Invoke的线程安全方式;三是使用BackgroundWorker的线程安全方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

现象

有时候,我们需要加载一些比较耗时的操作通常会在线程中加载,而在线程中涉及到UI控件,如下面的写法,就会报错:

线程间操作无效: 从不是创建控件“textBox1”的线程访问它。

Thread td = new Thread(() =>
{
    textBox1.Text = "123";
});
td.Start();

 

 

解决方法

1.不捕获对错误线程的调用

 public FrmTest()
 {
     InitializeComponent();

     CheckForIllegalCrossThreadCalls = false;
 }

这种属于非线程安全方式,一般不适用这种

2.线程安全方式:Invoke

private void SetText(string text)
{
    if (textBox1.InvokeRequired)
    {
        Action<string> action = new Action<string>(SetText);
        Invoke(action, new object[] { text });
    }
    else
    {
        textBox1.Text = text;
    }
}

 

Thread td = new Thread(() =>
{
    SetText("123");
});
td.Start();

3.线程安全方式:BackgroundWorker

BackgroundWorker backgroundWorker1 = new BackgroundWorker();
backgroundWorker1.RunWorkerCompleted += backgroundWorker1_RunWorkerCompleted;

backgroundWorker1.RunWorkerAsync();

 

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    textBox1.Text = "123";
}

这种方式,不懂,还是记着,平时也没用到

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

GreAmbWang

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

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

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

打赏作者

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

抵扣说明:

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

余额充值