C#子线程中更新ui
本文实例总结了C#子线程更新UI控件的方法,对于桌面应用程序设计的UI界面控制来说非常有实用价值。分享给大家供大家参考之用。具体分析如下:
一般在winform C/S程序中经常会在子线程中更新控件的情况,桌面程序UI线程是主线程,当试图从子线程直接修改控件属性时会出现“从不是创建控件的线程访问它”的异常提示。
跨线程更新UI控件的常用方法有两种:
1.使用控件自身的invoke/BeginInvoke方法
2.使用SynchronizationContext的Post/Send方法更新
具体实现如下:
1.使用控件自身的invoke/BeginInvoke方法
Control类实现了ISynchronizeInvoke 接口。
Control类的invoke方法有两个实现
Object Invoke(Delegate); //在拥有此控件的基础窗口句柄的线程上执行指定的委托
Object Invoke(Delegate,Object[] );
可以看出继承Control类的UI控件都可以使用Invoke方法异步更新。以下代码段实现在子线程中更新Label控件的Text属性
- private void button6_Click(object sender, EventArgs e)
- {
- Thread demoThread =new Thread(new ThreadStart(threadMethod));
- demoThread.IsBackground = true;
- demoThread.Start();//启动线程
- }
- void threadMethod()
- {
- Action<String> AsyncUIDelegate=delegate(string n){label1.Text=n;};/<span style="font-family: Arial, Helvetica, sans-serif;">/定义一个委托</span>
- label1.Invoke(AsyncUIDelegate,new object[]{"修改后的label1文本"});
- }
2.使用SynchronizationContext的Post/Send方法更新
SynchronizationContext类在System.Threading命令空间下,可提供不带同步的自由线程上下文,其中Post方法签名如下:
public virtual void Post(SendOrPostCallback d,Object state) //将异步消息调度到一个同步上下文
可以看出我们要异步更新UI控件,第一是要获取UI线程的上下文了,第二就是调用post方法了,代码实现:
- SynchronizationContext _syncContext = null;
- private void button6_Click(object sender, EventArgs e)
- {
- Thread demoThread =new Thread(new ThreadStart(threadMethod));
- demoThread.IsBackground = true;
- demoThread.Start();//启动线程
- }
- //窗体构造函数
- public Form1()
- {
- InitializeComponent();
- //获取UI线程同步上下文
- _syncContext = SynchronizationContext.Current;
- }
- private void threadMethod()
- {
- _syncContext.Post(SetLabelText, "修改后的文本");//子线程中通过UI线程上下文更新UI
- }
- private void SetLabelText(object text)
- {
- this.lable1.Text = text.ToString();
- }
原文链接:http://blog.csdn.net/smilefyx/article/details/47724911
C#子线程中更新ui的更多相关文章
- Android在子线程中更新UI(二)
MainActivity如下: package cc.testui2; import android.os.Bundle; import android.view.View; import andro ...
- Android在子线程中更新UI(一)
MainActivity如下: package cc.testui1; import android.os.Bundle; import android.os.Handler; import andr ...
- android 不能在子线程中更新ui的讨论和分析
问题描写叙述 做过android开发基本都遇见过 ViewRootImpl$CalledFromWrongThreadException,上网一查,得到结果基本都是仅仅能在主线程中更改 ui.子线程要 ...
- 使用Handler在子线程中更新UI
Android规定仅仅能在主线程中更新UI.假设在子线程中更新UI 的话会提演示样例如以下错误:Only the original thread that created a view hierach ...
- Android多线程之(一)View.post()源码分析——在子线程中更新UI
提起View.post(),相信不少童鞋一点都不陌生,它用得最多的有两个功能,使用简便而且实用: 1)在子线程中更新UI.从子线程中切换到主线程更新UI,不需要额外new一个Handler实例来实现. ...
- 如何在子线程中更新UI
一:报错情况 android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that creat ...
- Android开发UI之在子线程中更新UI
转自第一行代码-Android Android是不允许在子线程中进行UI操作的.在子线程中去执行耗时操作,然后根据任务的执行结果来更新相应的UI控件,需要用到Android提供的异步消息处理机制. 代 ...
- Android 在子线程中更新UI
今天在做练习时,在一个新开启的线程中调用“Toast.makeText(MainActivity.this, "登陆成功",Toast.LENGTH_SHORT).show();” ...
- 老问题:Android子线程中更新UI的3种方法
在Android项目中经常有碰到这样的问题,在子线程中完成耗时操作之后要更新UI,下面就自己经历的一些项目总结一下更新的方法: 方法一:用Handler 1.主线程中定义Handler: Handle ...
随机推荐
- NOI2018前的每日记录
NOI2018前的每日记录 开头 今天是\(2018.7.2\),不知不觉已经这么久了.本来还是高一的小蒟蒻,过不了多久就要成为高二的老年选手了. 再过半个月我也要去\(NOI\)打酱油了.我这种D类 ...
- Unity3D实现3D立体游戏原理及过程
Unity3D实现3D立体游戏原理及过程 183 0 0 下面的教程是我今天整理的资料,教大家一步步完成自己的3D立体游戏,并向大家介绍一些3D成像的原理. 理论上,每个普通的非立体3 ...
- Linux内核设计第五周学习总结 分析system_call中断处理过程
陈巧然原创作品 转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 使用gdb跟踪分析一 ...
- nginx php fastcgi Connection reset by peer的原因及解决办法
Connection reset by peer 这个错误是在nginx的错误日志中发现的,为了更全面的掌握nginx运行的异常,强烈建议在nginx的全局配置中增加 error_log logs ...
- 音视频处理之FFmpeg程序的介绍与使用20180302
一.FFMPEG程序介绍与使用 主要介绍一下ffmpeg工程包含的三个exe的使用方法. 1. FFMPEG程序介绍 1.1.下载 ffmpeg的官方网站是:http://ffmpeg.org/ 下载 ...
- openresty--centos7下开发环境安装
1. 安装依赖的软件包 yum install readline-devel pcre-devel openssl-devel gcc 2. 安装openresty -- 1. 下载openresty ...
- Hdu3223 Decrypt Messages
Decrypt Messages Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- spring boot 2.0.3+spring cloud (Finchley)9、 安全组件Spring Boot Security
官方文档 一.Spring Security介绍 Spring Security是Spring Resource社区的一个安全组件,Spring Security为JavaEE企业级开发提供了全面的安 ...
- 几种不同程序语言的HMM版本
几种不同程序语言的HMM版本 “纸上得来终觉浅,绝知此事要躬行”,在继续翻译<HMM学习最佳范例>之前,这里先补充几个不同程序语言实现的HMM版本,主要参考了维基百科.读者有兴趣的话可以研 ...
- 【BZOJ】1597 [Usaco2008 Mar]土地购买
[算法]DP+斜率优化 [题意]n(n≤50000)块土地,长ai宽bi,可分组购买,每组代价为max(ai)*max(bi),求最小代价. [题解] 斜率优化:http://www.cnblogs. ...