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. }

然后直接这样调用

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. 【转】JavaScript 风格指南/编码规范(Airbnb公司版)

    原文转自:http://blog.jobbole.com/79484/ Airbnb 是一家位于美国旧金山的公司,本文是其内部的 JavaScript 风格指南/编码规范,在 Github 上有 11 ...

  2. ext grid 前台grid加载数据碰到数据重复只显示一条

    在使用gridPanel的时候,如果其数据有字段名为“id”,且数据中id值相同的情况时,相同id的数据只会显示一条,这是因为Ext读取JSON数据的时候采用了类似主键唯一的方式,而这里的主键默认叫“ ...

  3. CLR via C# 3rd - 01 - The CLR's Execution Model

    1. Assemly       A managed module is a standard 32-bit Microsoft Windoes portable executable (PE32) ...

  4. storyboard tabbarcontroller设置tab的图片

    在storyboard里逐项设置了图片,咦,怎么是颜色?别急,慢慢来 找到你的tabbarcontroller指向的viewcontroller,在viewdidload里做如下事,搞定 - (voi ...

  5. flex4

    今天发现了一个问题:昨天把序列号输入之后可以用了,但是再次打开软件之后还是要求输序列号的.遇到这种情况的朋友可以这样操作.打开C:\WINDOWS\system32\drivers\etc这个目录,修 ...

  6. URL参数为url,获取不到部分参数问题

    url1中的参数含有url2,在页面上获取url时发现url后面跟的参数获取不到,其实是浏览器把url2中&后的参数作为url1的参数来处理了. 如:http://www.ilcng.com/ ...

  7. sass在mac中安装

    $ curl -L https://get.rvm.io | bash -s stable $ source ~/.rvm/scripts/rvm $ rvm -v $ rvm install 2.0 ...

  8. 《Web全栈工程师的自我修养》读书笔记(转载)

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/5 ...

  9. linux下根据进程名字获取PID,类似pidof(转)

    linux有一个命令行工具叫做pidof,可以根据用户输入的进程名字查找到进程号,但有时候我们需要在程序里实现,不想调用system,在查阅了很多版本的pidof源代码后,没有发现一个自己感觉比较好的 ...

  10. PHP 与pdf文档 与条码

    必要的步骤 1.导入require_once "tcpdf/tcpdf.php"; 工具源码在demo中 2.$pdf = new TCPDF("P", &qu ...