找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2161|回复: 12

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

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

2823

主题

541

回帖

2万

积分

管理员

积分
22569
发表于 2021-9-20 15:52:03 | 显示全部楼层 |阅读模式
Winform 多线程中处理UI控件, 多线程中不能直接操作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. }
复制代码


工控课堂 www.gkket.com

0

主题

159

回帖

553

积分

中级会员

积分
553
发表于 2021-9-20 15:57:14 | 显示全部楼层
淡定,淡定,淡定……
工控课堂 www.gkket.com

0

主题

124

回帖

387

积分

注册会员

积分
387
发表于 2021-9-20 16:04:08 | 显示全部楼层
我只是路过打酱油的。
工控课堂 www.gkket.com

0

主题

112

回帖

165

积分

新手上路

积分
165
发表于 2025-11-16 20:40:50 | 显示全部楼层
学到干货了,感谢分享,已火速收藏
工控课堂 www.gkket.com

0

主题

44

回帖

69

积分

新手上路

积分
69
发表于 2025-11-16 21:12:31 | 显示全部楼层
占个楼慢慢看,先马克一下
楼主辛苦啦,期待下一篇分享
工控课堂 www.gkket.com

0

主题

80

回帖

123

积分

新手上路

积分
123
发表于 2025-11-16 21:14:19 | 显示全部楼层
原来还有这种操作,长见识了!
工控课堂 www.gkket.com

0

主题

103

回帖

326

积分

注册会员

积分
326
发表于 2025-11-16 21:23:34 | 显示全部楼层
浅蹲一个后续,楼主更新踢我一下
工控课堂 www.gkket.com

0

主题

85

回帖

136

积分

新手上路

积分
136
发表于 2025-11-16 21:32:17 | 显示全部楼层
不请自来,只为说一句:太精彩了!
工控课堂 www.gkket.com

0

主题

180

回帖

386

积分

注册会员

积分
386
发表于 2025-11-16 21:40:43 | 显示全部楼层
路过混个脸熟,顺便为优质内容打 call~
工控课堂 www.gkket.com

0

主题

90

回帖

136

积分

新手上路

积分
136
发表于 2025-11-16 21:46:09 | 显示全部楼层
水个经验,支持楼主,加油呀
工控课堂 www.gkket.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

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

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

GMT+8, 2025-12-23 05:32 , Processed in 0.101681 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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