关于Winform 2.0以后多线程不能更新UI的办法

DotNet 2.0以后Winform在多线程Debug模式下更新UI会报这个错:

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


解决办法如下:

1.在Winform的构造函数中添加这么一句:

Control.CheckForIllegalCrossThreadCalls = false;

意思就是不检查跨线程调用,这样做是有风险的,特别是控件操作频繁时,会有意想不到的结果,这也是微软不建议用的原因,如果你的程序ui交互比较少,个人觉得用用也无妨

 

2.利用Control的BeginInvoke和EndInvoke来更新,

直接对Control类进行扩展,代码如下:

 1 /// <summary>
 2     /// Control扩展
 3     /// </summary>
 4     public static class UIExtend
 5     {
 6         /// <summary>
 7         /// 跨线程更新UI控件
 8         /// </summary>
 9         /// <param name="control"></param>
10         /// <param name="handler"></param>
11         public static void SafeInvoke(this Control control, Action handler)
12         {
13             if (control.InvokeRequired)
14             {
15                 while (!control.IsHandleCreated)
16                 {
17                     if (control.Disposing || control.IsDisposed)
18                         return;
19                 }
20                 IAsyncResult result = control.BeginInvoke(new Action<Control, Action>(SafeInvoke), new object[] { control, handler });
21                 control.EndInvoke(result);
22                 return;
23             }
24             IAsyncResult result2 = control.BeginInvoke(handler);
25             control.EndInvoke(result2);
26         }
27     }

然后直接这样调用

 1 this.lstInfoXxx.SafeInvoke(() => { lstInfoXxx.Items.Add(respDecA.No1+ ":XXX更新成功!"); }); 

 

还有一些方法,我就不介绍了,已经能解决问题了,详情可以看看这篇Blog,杨过大侠写的:

传送门:http://www.cnblogs.com/yjmyzz/archive/2009/11/25/1610253.html

看完后记得给大侠点赞,谢谢~

 

转载于:https://www.cnblogs.com/michael90/p/6014800.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值