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

本文详细解析了在.NET 2.0及更高版本中,从非创建线程访问UI控件导致的线程间操作无效问题。介绍了问题产生的根本原因,包括控件可能进入不一致状态和死锁风险。提供了两种解决方案:一是禁用非法跨线程调用检查,二是使用代理方法安全地更新控件状态。

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

源文链接:https://blog.youkuaiyun.com/TheBestAge/article/details/85331742
线程间操作无效:从不是创建控件“textBox1”的线程访问它

问题代码:
public void test(object source, ElapsedEventArgs e)
{
//实例化BLL层对应界面
QRcodeBLL qucode = new QRcodeBLL();

        //501考场剩余座位
        StudentBindPaperTypeEntity StudentBindPaperType = new StudentBindPaperTypeEntity();
        StudentBindPaperType.IP = textBox2.Text.Trim();
        DataTable dt = qucode.SelectByIP(StudentBindPaperType);
        //511考场剩余座位
        StudentBindPaperTypeEntity StudentBindPaperType1 = new StudentBindPaperTypeEntity();
        StudentBindPaperType.IP = textBox3.Text.Trim();
        DataTable table = qucode.SelectByIP(StudentBindPaperType);

        textBox1.Text = "501剩余座位数:" + (200 - Convert.ToInt32(dt.Rows[0][0])) + Environment.NewLine
                      + "511剩余座位数:" + (200 - Convert.ToInt32(table.Rows[0][0]));
    }

问题解决:
1.在窗体的构造函数中添加:

System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
1
2.通过代理来解决:

private delegate void SetTextCallback(string text);
//在给textBox1.text赋值的地方调用以下方法即可
private void SetText(string text)
{
// InvokeRequired需要比较调用线程ID和创建线程ID
// 如果它们不相同则返回true
if (this.textBox1.InvokeRequired)
{
SetTextCallback d = new SetTextCallback(SetText);
this.Invoke(d, new object[] { text });
}
else
{
this.textBox1.Text = text;
}
}

问题产生原因:
  NET2.0以后拒绝多线程访问控件,避免控件造成死锁。
  在UI线程创建的子线程操作UI控件,访问windows窗台控件在本质上不是线程安全的。如果有两个或多个线程操作某一控件的状态,则可能会迫使该控件进入一种不一致的状态。还可能出现其他与线程相关的bug,包括争用情况和死锁。确保以线程安全方式访问控件非常重要。
  在调试器中运行应用程序时,如果创建某控件的线程之外的其他线程试图调用该控件,则调试器会引发一个InvalidOperationException异常,并提示消息:“从不是创建控件的线程访问它”。

原文链接:https://blog.youkuaiyun.com/TheBestAge/article/details/85331742

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值