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

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

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

  1. winform中如何在多线程中更新UI控件--ListView实时显示执行信息

    1.在winform中,所有对UI的操作,都得回到UI线程(主线程)上来,才不会报错 线程间操作无效: 从不是创建控件的线程访问它. 2.在winform中,允许通过Control.invoke对控件 ...

  2. Winform实现多线程异步更新UI(进度及状态信息)

    引言 在进行Winform程序开发需要进行大量的数据的读写操作的时候,往往会需要一定的时间,然在这个时间段里面,界面ui得不到更新,导致在用户看来界面处于假死的状态,造成了不好的用户体验.所以在大量数 ...

  3. C#多线程下更新UI的几种方法

    1. 使用UI线程的SynchronizationContext的Post/Send方法,这种情况一般在窗体构造函数或者FormLoad中获取同步上下文: 范例: public partial cla ...

  4. Winform之跨线程更新UI

    Winform之跨线程更新UI 使用`Invoke`或者`BeginInvoke`与UI线程交互示例 参考及源码 使用Invoke或者BeginInvoke与UI线程交互示例 private void ...

  5. 富客户端 wpf, Winform 多线程更新UI控件

    前言 在富客户端的app中,如果在主线程中运行一些长时间的任务,那么应用程序的UI就不能正常相应.因为主线程要负责消息循环,相应鼠标等事件还有展现UI. 因此我们可以开启一个线程来格外处理需要长时间的 ...

  6. (转).NET 4.5中使用Task.Run和Parallel.For()实现的C# Winform多线程任务及跨线程更新UI控件综合实例

    http://2sharings.com/2014/net-4-5-task-run-parallel-for-winform-cross-multiple-threads-update-ui-dem ...

  7. C# Winform 跨线程更新UI控件常用方法汇总(多线程访问UI控件)

    概述 C#Winform编程中,跨线程直接更新UI控件的做法是不正确的,会时常出现“线程间操作无效: 从不是创建控件的线程访问它”的异常.处理跨线程更新Winform UI控件常用的方法有4种:1. ...

  8. Winform(C#.NET)自动更新组件的使用及部分功能实现

    声明:核心功能的实现是由园子里圣殿骑士大哥写的,本人是基于他核心代码,按照自己需求进行修改的.   而AutoUpdaterService.xml文件生成工具是基于评论#215楼 ptangbao的代 ...

  9. 36.Android之多线程和handle更新UI学习

    android经常用到多线程更新UI,今天学习下. 首先布局比较简单: <?xml version="1.0" encoding="utf-8"?> ...

随机推荐

  1. C - 搜索

    Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Descr ...

  2. 使用java连接MySQL数据库

    import java.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException;import com.mys ...

  3. null、undefined、false、0相等性比较

    之前在看<JavaScript权威指南>的时候看到三个相等性比较的式子: null == undefined ;// ==>true undefined == false;// == ...

  4. java程序链接到sql server数据库

    package jianhua; import java.sql.*; public class ConDatabase { public static void main(String[] args ...

  5. 关于C语言的问卷调查(补交)

    你对自己的未来有什么规划?做了哪些准备?(还是处于比较迷茫的状态:我做的准备是吧自己对计算机的兴趣提起来!) 你认为什么是学习?学习有什么用?现在学习动力如何?为什么?(学习就是学自己不会的东西:增加 ...

  6. 今天网站后台登录页面需要生成一个二维码,然后在手机app上扫描这个二维码,实现网站登录的效果及其解决方案如下

    要实现二维码登录,需要解决2个技术,1.需要js websocket 与后台php实现长连接技术 2.实现二维码生成技术 要实现这个功能第二个算是比较简单,只需要下载一个php的二维码生成器即可,但要 ...

  7. 关于js代码中与或运算符||&&的妙用

    看bootstrap时看到如下一行JavaScript代码产生了疑惑. return window.pageYOffset || e.scrollTop ||在这里的作用是什么呢? 首先明确概念,在j ...

  8. NewQuant正式在Github发布

    Github上的NewQuant https://github.com/xuruilong100/NewQuant NewQuant简介: NewQuant是一个小型开源C++库,可以解决数据分析.金 ...

  9. linux下安装安装pcre-8.32

    linux下安装安装pcre-8.32 ./configure --prefix=/usr/local/pcre 出现以下错误 configure: error: You need a C++ com ...

  10. OpenGL渲染管线

    OpenGL渲染管线具有一系列顺序处理阶段.两个图形信息数据,顶点数据与像素数据,在管线中被处理.组合,最终写入帧缓存.注意,OpenGL可以将处理过的数据送回到你的程序中.(参考灰色区域) Open ...