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跨线程的资料请关注我们其它相关文章!
相关推荐
-
C# winform主界面打开并关闭登录界面的方法
在winform 界面编程中,我们有时候要在主界面打开之前先显示登录界面,当登录界面用户信息校验正确后才打开主界面,而这时登陆界面也完成使命该功成身退了. 目前有两种方法可实现: 方法1. 隐藏登录界面 Program.cs 中代码如下: /// <summary> /// 应用程序的主入口点. /// </summary> [STAThread] static void Main() { Application.EnableVisualStyles(); Application.
-
C#中如何使用Winform实现炫酷的透明动画界面
做过.NET Winform窗体美化的人应该都很熟悉UpdateLayeredWindow吧,UpdateLayeredWindow可以实现窗体的任意透明,效果很好,不会有毛边.不过使用这个API之后,会有一个问题就是无法使用普通控件,而且没有Paint消息.为了解决这个问题,有两种方法. 一.使用双层窗体,底层窗体使用UpdateLayeredWindow作为背景,上层窗体用普通窗体,并且可以使用TransparencyKey或者Region来实现去除不需要的窗体内容,让上层窗体能看到底层的窗
-
c# winform异步不卡界面的实现方法
快速阅读 如何在winform程序中,让界面不再卡死. 关于委托和AsyncCallback的使用. 界面卡死的原因是因为耗时任务的计算占用了主线程,导致主界面没有办法进行其它操作,比如拖动.造成界面卡死的现象.我们只需要把耗时任务放在子线程中执行就可以了. 子线程的计算结果 要更新到界面中,怎么更新呢,因为不能操作主线程 ,所以要用委托来实现 . 我们来看个例子. 场景 界面上一个按钮加一人richbox , 点击以后获得当前所在年份 代码实现 定义一个委托实现子线程更新主线程 public
-
C# WinForm 登录界面的图片验证码(区分大小写+不区分大小写)
一.功能界面 图1 验证码(区分大小写) 图2 验证码(不区分大小写) 二.创建一个产生验证码的类Class1 (1)生成随机验证码字符串,用的是Random随机函数 (2)创建验证码图片,将该字符串画在PictureBox控件中 Class1.cs: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using S
-
C#中使用IrisSkin2.dll美化WinForm程序界面的方法
一.添加控件IrisSkin2.dll.方法: 1.右键"工具箱"."添加选项卡",取名"皮肤". 2.右键"皮肤","选择项"弹出对话框 3.点击"浏览",找到IrisSkin2.dll,,next,next,确定. 4.在皮肤里会出现. 5.把SkinEngine拖到设计界面,会出现在下面. 二,把皮肤文件中以ss
-
C#之WinForm跨线程访问控件实例
本文实例讲述了C#中WinForm跨线程访问控件的实现方法,分享给大家供大家参考. 具体实现方法如下: 1.跨线程访问控件委托和类的定义 复制代码 代码如下: using System; using System.Windows.Forms; namespace ahwildlife.Utils { /// <summary> /// 跨线程访问控件的委托 /// </summary> public delegate void InvokeDeleg
-
C#-WinForm跨线程修改UI界面的示例
背景 在我做WinForm开发的过程中,经常会遇到耗时操作或阻塞操作.他们会引发软件的卡顿甚至假死,严重影响软件的使用.因此,这类耗时或阻塞的操作一般都会使用异步的方式去执行,不影响主线程(UI线程)与用户间的交互.但多个线程竞争读写同一个资源往往会造成意想不到的意外结果,UI界面也是一种资源,所以跨线程修改UI界面往往被加以限制.而在Winform中,跨线程修改UI界面同样是不被允许的.在子线程中修改界面控件时Visual Studio会报出如下错误: 解决思路 .Net提供了很多跨线程修改U
-
Winform中如何跨线程访问UI元素
在C# 的应用程序开发中, 我们经常要把UI线程和工作线程分开,防止界面停止响应, 同时我们又需要在工作线程中更新UI界面上的控件.但直接访问会出现"线程间操作无效"的情况,因为.NET禁止了跨线程调用控件, 否则谁都可以操作控件,最后可能造成错误. 下面介绍几种跨线程访问的方法: 1.禁止对跨线程访问做检查 (不推荐使用这种方法) 这种方法不检查跨线程访问,允许各个线程操作UI元素,容易出现错误. public Form2() { InitializeComponent(); //禁
-
C# winform跨线程操作控件的实现
前提:当我们使用Winform开发的时候,经常会遇到:System.InvalidOperationException:“线程间操作无效: 从不是创建控件“xxxx”的线程访问它.” 原因:发生次异常的原因是因为winform在渲染UI界面和操作界面数据的时候使用的是同一个线程.当我们创建另外一个线程,去操作此线程的UI控件,会导致线程不安全.winform为了防止线程不安全,因此杜绝了这个跨线程操作,并且抛出异常. 异常举例:创建两个控件,一个是按钮控件,一个是lable控件 private
-
Python+PyQT5的子线程更新UI界面的实例
子线程里是不能更新UI界面的,在移动端方面.Android的UI访问是没有加锁的,多个线程可以同时访问更新操作同一个UI控件.也就是说访问UI的时候,android系统当中的控件都不是线程安全的,这将导致在多线程模式下,当多个线程共同访问更新操作同一个UI控件时容易发生不可控的错误.所以Android中规定只能在UI线程中访问UI,相当于从另一个角度给Android的UI访问加上锁,一个伪锁. 在PyQT5中使用QThread from PyQt5.QtWidgets import QMainW
-
Winform跨线程操作的简单方法
分析:label标签控件是主线程创建的,不能直接从另一个线程访问.可以这样认为:不能跨线程直接访问控件; 最简单的办法就是: 复制代码 代码如下: using System.Windows.Forms; Parent.Invoke(new MethodInvoker(delegate { Parent.label1.Text = "成功" ; })); 其中,"Parent"是主窗体名称. 这样,我们就是在需要窗体控件产生变化的时候,发消息通知主窗体改变
-
pyside写ui界面入门示例
PySide是一个免费的软件,与PyQt不同之处在于使用了LGPL,允许PySide免费的开发商业软件. PySide有15个模块.这些模块支持对GUI,多媒体,XML,网络以及数据库进行操作.本教程的目的主要是学习其中的两个模块:QtCore和QtGui. QtCore是非界面功能模块,主要对文件目录,数据类型,输入输出流,url以及线程等提供支持.QtGui提供了对常见界面元素的支持,例如,对话框,窗口,状态栏,工具栏等等. 首先从Hello world开始 复制代码 代码如下: #!/us
-
C#子线程更新UI控件的方法实例总结
本文实例总结了C#子线程更新UI控件的方法,对于桌面应用程序设计的UI界面控制来说非常有实用价值.分享给大家供大家参考之用.具体分析如下: 一般在winform C/S程序中经常会在子线程中更新控件的情况,桌面程序UI线程是主线程,当试图从子线程直接修改控件属性时会出现"从不是创建控件的线程访问它"的异常提示. 跨线程更新UI控件的常用方法有两种: 1.使用控件自身的invoke/BeginInvoke方法 2.使用SynchronizationContext的Post/Send方法更
-
C#多线程与跨线程访问界面控件的方法
本文实例讲述了C#多线程与跨线程访问界面控件的方法.分享给大家供大家参考.具体分析如下: 在编写WinForm访问WebService时,常会遇到因为网络延迟造成界面卡死的现象.启用新线程去访问WebService是一个可行的方法. 典型的,有下面的启动新线程示例: 复制代码 代码如下: private void LoadRemoteAppVersion() { if (FileName.Text.Trim() == "") return; StatusLabel
-
C#跨PC远程调用程序并显示UI界面
在项目中有一个需求是需要在局域网内跨PC远程调用一个程序,并且要求有界面显示,调查了一些资料,能实现远程调用的.Net技术大概有PsExec.WMI.Schedule Task. 这三种方式都做了一个尝试,结果发现PsExec.WMI都只能在进程列表中看到程序执行,却无法显示界面,无法执行程序中的管理员权限操作,就连简单的在C盘创建一个txt文本都做不到. 也许是我使用方法不对,无法达到我的需求.直到后来使用了Schedule Task的方式之后,才成功实现了我的需求. 第三种技术的主要思路是先
随机推荐
- 菜鸟黑客入门攻击及防范技巧
- ASP.NET编程获取网站根目录方法小结
- 如何用JavaScript实现动态修改CSS样式表
- ASP.NET入门随想之检票的老太太
- 详解php实现页面静态化原理
- JSP 开发之Servlet解决网页缓存问题
- php使用Jpgraph创建折线图效果示例
- 基于JS实现密码框(password)中显示文字提示功能代码
- VBS教程:属性-Files 属性
- VBS教程:函数-Second 函数
- MySQL学习笔记3:表的基本操作介绍
- Java 条件控制与循环控制实例
- 解除使用Linux分区工具时给大家带来的困扰
- Laravel中unique和exists验证规则的优化详解
- Python模块搜索路径代码详解
- ASP.NET Core实现单体程序的事件发布/订阅详解
- JS计算斐波拉切代码实例
- Java 数组ArrayList常用语法详解
- JS数组实现分类统计实例代码
- vue router 配置路由的方法