背景

在我做WinForm开发的过程中,经常会遇到耗时操作或阻塞操作。他们会引发软件的卡顿甚至假死,严重影响软件的使用。因此,这类耗时或阻塞的操作一般都会使用异步的方式去执行,不影响主线程(UI线程)与用户间的交互。但多个线程竞争读写同一个资源往往会造成意想不到的意外结果,UI界面也是一种资源,所以跨线程修改UI界面往往被加以限制。而在Winform中,跨线程修改UI界面同样是不被允许的。在子线程中修改界面控件时Visual Studio会报出如下错误:

解决思路

.Net提供了很多跨线程修改UI的方法,每种方法也有与之对应的工具类。我最常用的方法是ThreadPool+ delegate的方式完成跨线程对UI对的修改。

实例代码

1、定义委托,把内容写在控件里面

   private delegate void SetLabelDelegate(string value);private delegate void SetLabelDelegate2(string value);private void SetText(string value){if (this.InvokeRequired){SetLabelDelegate d = new SetLabelDelegate(SetText);this.Invoke(d, new object[] { value });}else{txtbigcrmresult.Text = value.ToString() + txtbigcrmresult.Text;}}

2、定义方法,线程调用

  private void button3_Click(object sender, EventArgs e){ThreadPool.QueueUserWorkItem(new WaitCallback(dao), "test");}
  private void dao(object url){IDbConnection conn = new SqlConnection(txtbigcrmui.Text);SetText("\r\n" + "start");.........................SetText("\r\n" + "end");}

3、更新ui控件

 SetText("\r\n" + "start");

总结

1、使用delegate实现跨线程更新UI;

2、使用ThreadPool实现多线程执行方法,避免卡顿;

C#-WinForm跨线程修改UI界面相关推荐

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

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

  2. C# WinForm跨线程访问UI控件

    C# 跨线程访问控件 在做WinForm时,在UI线程之外调用控件会报异常:System.InvalidOperationException:"线程间操作无效: 从不是创建控件"l ...

  3. C# winform 跨线程修改界面

    我们可以使用invoke和bengininvoke invoke同步执行一个委托 begininvoke异步执行一个委托 转载于:https://www.cnblogs.com/birdofparad ...

  4. 简短总结一下C#里跨线程更新UI

    简短总结一下C#里跨线程更新UI 摘自: http://my.oschina.net/sdqxcxh/blog/53707 跨线程更新UI是写多线程程序尤其是通信类的程序经常遇到的问题,这里面主要的问 ...

  5. 简短总结一下C#里跨线程更新UI(转)

    摘自: http://my.oschina.net/sdqxcxh/blog/53707 跨线程更新UI是写多线程程序尤其是通信类的程序经常遇到的问题,这里面主要的问题是冲突,比如数据线程想要更新UI ...

  6. 心得 如何优雅地跨线程修改主线程窗口控件

    编程环境要求:VS2008/FX2.0 众所周知,从VS2005/FX2.0起,在多线程环境下是不允许跨线程修改主线程上窗口控件的. 例如: private void button1_Click(ob ...

  7. C# 委托 / 跨线程访问UI / 线程间操作无效: 从不是创建控件“Form1”的线程访问它...

    C# 委托 / 跨线程访问UI /  线程间操作无效: 从不是创建控件"Form1"的线程访问它 网上的代码都比较复杂,还是这个简单 见代码, 简易解决办法: 主窗体代码 usin ...

  8. C# winform跨线程操作控件

    前提:当我们使用Winform开发的时候,经常会遇到:System.InvalidOperationException:"线程间操作无效: 从不是创建控件"xxxx"的线 ...

  9. Unity脚本子线程修改UI的一种方式

    初学Unity,发现它和Android一样,没法在子线程中修改UI,甚至没法创建GameObject或者使用GameObject.Find() 于是又只有拐着弯去实现线程间通信. 我使用了一种方法,在 ...

最新文章

  1. 关于Docker目录挂载的总结(转)
  2. win7-64系统安装oracle 11G客户端
  3. 【Flask】sqlalchemy 排序
  4. vs 窗体连接mysql_vs2008 c#开发windows窗体程序,怎么连接数据库?
  5. [渝粤教育] 南开大学 思辨式英文写作 参考 资料
  6. json转python_将“true”(JSON)转换为Python等效的“True”
  7. js 生成二维码_js 生成二维码
  8. 通过helm在k8s上部署spark(伪集群版)
  9. html页面的ajax请求,【提问】ajax请求返回整个html页面
  10. SpringBoot整合jsp技术
  11. 【Scratch案例教学】scratch手把手教小朋友制作飞机大战、空中格斗、星际争霸等超酷游戏
  12. 使用Jackson进行json转对象,对象转json总结
  13. java过滤空号了停机号_手机空号、停机、注销,空号检测为你去除无效号码
  14. python画余弦曲线_使用python画圆以及正弦余弦曲线
  15. 2022上半年,大城市的各行业工资水平,让人触目惊心
  16. FX5U modbustcp通讯
  17. Win11亮度无法调节解决方法(在卸载驱动,关闭自适应亮度和修改注册表都行不通的情况下)
  18. 广度优先搜索算法和深度优先搜索算法——关于路径搜索的问题解决
  19. python线程关闭
  20. PTA 10-43 计算xsda表中最矮同学的身高

热门文章

  1. ZooKeeper相关资料集锦
  2. 8-[多线程] 进程池线程池
  3. 核心编程之十一章的11-9
  4. ubuntu make menuconfig error
  5. 开发Android应用 提升性能的小技巧
  6. System.Xml名称空间下的支持DOM的类型
  7. mysql的concat函数_MySQL中concat函数(连接字符串)
  8. 无法创建系统映像_如何创建USB驱动器的映像
  9. VMware Workstation All Key
  10. Linux学习笔记之一————什么是Linux及其应用领域