飞凌通信息科技

企业信息化专家

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

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

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

 

posted on 2016-10-31 09:43  Eric.Wu  阅读(255)  评论(0编辑  收藏  举报
易用软件 | 专注中小企业信息化