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

当我们再程序中遇到此错误时是因为跨线程调用控件。原因:.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

posted @   herry507  阅读(828)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示