找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2097|回复: 12

Winform 多线程中处理UI控件, 解决线程安全引起的异常

 火.. [复制链接]
  • 打卡等级:常驻代表
  • 打卡总天数:34
  • 打卡月天数:6
  • 打卡总奖励:9027
  • 最近打卡:2025-12-17 23:15:51

2823

主题

541

回帖

2万

积分

管理员

积分
22569
发表于 2021-9-12 16:26:53 | 显示全部楼层 |阅读模式
Winform 多线程中处理UI控件, 解决线程安全引起的异常
  1. using System;
  2. using System.Threading;
  3. using System.Windows.Forms;

  4. namespace WindowsFormsApp10
  5. {
  6.     public partial class Form1 : Form
  7.     {
  8.         public Form1()
  9.         {
  10.             InitializeComponent();
  11.         }

  12.         /*
  13.             在窗体拖拽2个button,1个label
  14.          */
  15.         private void button1_Click(object sender, EventArgs e)
  16.         {
  17.             Thread thread = new Thread(Test1);
  18.             thread.Start();
  19.         }

  20.         // 线程中直接操作控件会引发线程安全异常
  21.         // Cross-thread operation not valid: Control 'label1' accessed from a thread other than the thread it was created on.'
  22.         private void Test1()
  23.         {
  24.             for (int i = 0; i < 1000; ++i)
  25.             {
  26.                 label1.Text = i.ToString();
  27.             }
  28.         }

  29.         // Control.CheckForIllegalCrossThreadCalls = false;// 可以解决掉所有控件安全异常
  30.         private void Test2()
  31.         {
  32.             Control.CheckForIllegalCrossThreadCalls = false;
  33.             for (int i = 0; i < 1000; ++i)
  34.             {
  35.                 label1.Text = i.ToString();
  36.             }
  37.         }

  38.         // 在线程中用委托操作UI控件
  39.         delegate void InvokeHandler();
  40.         private void Test3()
  41.         {
  42.             for (int i = 0; i < 1000; ++i)
  43.             {
  44.                 // net 2.0
  45.                 this.Invoke(new InvokeHandler(delegate ()
  46.                 {
  47.                     label1.Text = i.ToString();
  48.                 }));
  49.             }
  50.         }

  51.         // 在线程中用委托操作UI控件
  52.         private void Test4()
  53.         {
  54.             for (int i = 0; i < 1000; ++i)
  55.             {
  56.                 // net 3.5 以上
  57.                 this.Invoke((Action)(() =>
  58.                 {
  59.                     label1.Text = i.ToString();
  60.                 }));
  61.             }
  62.         }
  63.     }
  64. }
复制代码


来源:C#社区
原文:https://www.hicsharp.com/a/aa141b160dfc44d0a1b9a43e0a0947af




工控课堂 www.gkket.com

0

主题

81

回帖

244

积分

注册会员

积分
244
发表于 2021-9-12 16:26:53 | 显示全部楼层
看完楼主的帖子,我的心情竟是久久不能平息,受教了
工控课堂 www.gkket.com

0

主题

102

回帖

353

积分

注册会员

积分
353
发表于 2021-9-12 17:38:07 | 显示全部楼层
好东西一定要看看!
工控课堂 www.gkket.com

0

主题

172

回帖

445

积分

注册会员

积分
445
发表于 2025-11-12 12:49:51 | 显示全部楼层
求个链接 / 教程,楼主好人一生平安~
工控课堂 www.gkket.com

0

主题

73

回帖

373

积分

注册会员

积分
373
发表于 2025-11-12 13:03:41 | 显示全部楼层
这波分析到位,逻辑满分!
工控课堂 www.gkket.com

0

主题

93

回帖

138

积分

新手上路

积分
138
发表于 2025-11-12 14:45:31 | 显示全部楼层
笑不活了,评论区比正文还精彩
已转发给朋友,一起快乐一下
工控课堂 www.gkket.com
  • 打卡等级:即来则安
  • 打卡总天数:27
  • 打卡月天数:6
  • 打卡总奖励:7736
  • 最近打卡:2025-12-20 00:35:11

3317

主题

285

回帖

2万

积分

管理员

积分
23881
发表于 2025-11-14 23:13:20 | 显示全部楼层
我先占个楼,等下再慢慢看~
工控课堂 www.gkket.com

0

主题

123

回帖

420

积分

注册会员

积分
420
发表于 2025-11-15 00:10:53 | 显示全部楼层
理性围观,感觉大家说得都有道理
工控课堂 www.gkket.com

0

主题

83

回帖

128

积分

新手上路

积分
128
发表于 2025-11-15 00:15:32 | 显示全部楼层
楼主辛苦啦,期待下一篇分享
工控课堂 www.gkket.com

0

主题

586

回帖

1738

积分

高级会员

积分
1738
发表于 2025-11-15 00:18:15 | 显示全部楼层
被戳中笑点 / 泪点,太真实了!
工控课堂 www.gkket.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|手机版|免责声明|本站介绍|工控课堂 ( 沪ICP备20008691号-1 )

GMT+8, 2025-12-22 15:58 , Processed in 0.104447 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表