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
看完后记得给大侠点赞,谢谢~