DotNet 2.0以后Winform在多线程Debug模式下更新UI会报这个错:
线程间操作无效: 从不是创建控件“XXX”的线程访问它。
解决办法如下:
1.在Winform的构造函数中添加这么一句:
Control.CheckForIllegalCrossThreadCalls = false;
意思就是不检查跨线程调用,这样做是有风险的,特别是控件操作频繁时,会有意想不到的结果,这也是微软不建议用的原因,如果你的程序ui交互比较少,个人觉得用用也无妨
2.利用Control的BeginInvoke和EndInvoke来更新,
直接对Control类进行扩展,代码如下:
/// <summary>
/// Control扩展
/// </summary>
public static class UIExtend
{
/// <summary>
/// 跨线程更新UI控件
/// </summary>
/// <param name="control"></param>
/// <param name="handler"></param>
public static void SafeInvoke(this Control control, Action handler)
{
if (control.InvokeRequired)
{
while (!control.IsHandleCreated)
{
if (control.Disposing || control.IsDisposed)
return;
}
IAsyncResult result = control.BeginInvoke(new Action<Control, Action>(SafeInvoke), new object[] { control, handler });
control.EndInvoke(result);
return;
}
IAsyncResult result2 = control.BeginInvoke(handler);
control.EndInvoke(result2);
}
}
然后直接这样调用
this.lstInfoXxx.SafeInvoke(() => { lstInfoXxx.Items.Add(respDecA.No1+ ":XXX更新成功!"); });
还有一些方法,我就不介绍了,已经能解决问题了,详情可以看看这篇Blog,杨过大侠写的:
传送门:http://www.cnblogs.com/yjmyzz/archive/2009/11/25/1610253.html
看完后记得给大侠点赞,谢谢~