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

发布时间 2023-10-17 15:16:23作者: herry507

当我们再程序中遇到此错误时是因为跨线程调用控件。原因:.NET禁止了跨线程调用控件, 否则谁都可以操作控件,最后可能造成错误。 所以不是在创建控件所在的线程内调用就会发生这样的错误。

解决方案1
使用Invoke


this.Invoke(new EventHandler(delegate
{
dataGridView1.DataSource = Date;
label1.Text = $"数据总共有{dataGridView1.Rows.Count}行";
}));
1
2
3
4
5
6
解决方案2
最直接的方法 忽略对跨线程调用的检测
CheckForIllegalCrossThreadCalls = false;

public Form1()
{
InitializeComponent();
CheckForIllegalCrossThreadCalls = false;
}
1
2
3
4
5
解决方案3
定义一个委托(delegate),委托(delegate)可以将参数与方法传递给控件所在的线程,并由控件所在的线程执行,通过Invoke来调用,这样可以完美的解决此类问题。

private void button1_Click(object sender, EventArgs e)
{
new Thread(()=> {
Random random = new Random();
while (true)
{
Action action = () =>
{
label1.Text = random.Next(1, 10).ToString();
};
Invoke(action);
}
}).Start();
}
————————————————
版权声明:本文为CSDN博主「香煎三文鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_39569480/article/details/128914821