C#-WinForm跨线程修改UI界面
背景
在我做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界面相关推荐
- C# Winform 跨线程更新UI控件常用方法汇总(多线程访问UI控件)
概述 C#Winform编程中,跨线程直接更新UI控件的做法是不正确的,会时常出现"线程间操作无效: 从不是创建控件的线程访问它"的异常.处理跨线程更新Winform UI控件常用 ...
- C# WinForm跨线程访问UI控件
C# 跨线程访问控件 在做WinForm时,在UI线程之外调用控件会报异常:System.InvalidOperationException:"线程间操作无效: 从不是创建控件"l ...
- C# winform 跨线程修改界面
我们可以使用invoke和bengininvoke invoke同步执行一个委托 begininvoke异步执行一个委托 转载于:https://www.cnblogs.com/birdofparad ...
- 简短总结一下C#里跨线程更新UI
简短总结一下C#里跨线程更新UI 摘自: http://my.oschina.net/sdqxcxh/blog/53707 跨线程更新UI是写多线程程序尤其是通信类的程序经常遇到的问题,这里面主要的问 ...
- 简短总结一下C#里跨线程更新UI(转)
摘自: http://my.oschina.net/sdqxcxh/blog/53707 跨线程更新UI是写多线程程序尤其是通信类的程序经常遇到的问题,这里面主要的问题是冲突,比如数据线程想要更新UI ...
- 心得 如何优雅地跨线程修改主线程窗口控件
编程环境要求:VS2008/FX2.0 众所周知,从VS2005/FX2.0起,在多线程环境下是不允许跨线程修改主线程上窗口控件的. 例如: private void button1_Click(ob ...
- C# 委托 / 跨线程访问UI / 线程间操作无效: 从不是创建控件“Form1”的线程访问它...
C# 委托 / 跨线程访问UI / 线程间操作无效: 从不是创建控件"Form1"的线程访问它 网上的代码都比较复杂,还是这个简单 见代码, 简易解决办法: 主窗体代码 usin ...
- C# winform跨线程操作控件
前提:当我们使用Winform开发的时候,经常会遇到:System.InvalidOperationException:"线程间操作无效: 从不是创建控件"xxxx"的线 ...
- Unity脚本子线程修改UI的一种方式
初学Unity,发现它和Android一样,没法在子线程中修改UI,甚至没法创建GameObject或者使用GameObject.Find() 于是又只有拐着弯去实现线程间通信. 我使用了一种方法,在 ...
最新文章
- 关于Docker目录挂载的总结(转)
- win7-64系统安装oracle 11G客户端
- 【Flask】sqlalchemy 排序
- vs 窗体连接mysql_vs2008 c#开发windows窗体程序,怎么连接数据库?
- [渝粤教育] 南开大学 思辨式英文写作 参考 资料
- json转python_将“true”(JSON)转换为Python等效的“True”
- js 生成二维码_js 生成二维码
- 通过helm在k8s上部署spark(伪集群版)
- html页面的ajax请求,【提问】ajax请求返回整个html页面
- SpringBoot整合jsp技术
- 【Scratch案例教学】scratch手把手教小朋友制作飞机大战、空中格斗、星际争霸等超酷游戏
- 使用Jackson进行json转对象,对象转json总结
- java过滤空号了停机号_手机空号、停机、注销,空号检测为你去除无效号码
- python画余弦曲线_使用python画圆以及正弦余弦曲线
- 2022上半年,大城市的各行业工资水平,让人触目惊心
- FX5U modbustcp通讯
- Win11亮度无法调节解决方法(在卸载驱动,关闭自适应亮度和修改注册表都行不通的情况下)
- 广度优先搜索算法和深度优先搜索算法——关于路径搜索的问题解决
- python线程关闭
- PTA 10-43 计算xsda表中最矮同学的身高