本文实例总结了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属性

[csharp] view plain copy
  1. private void button6_Click(object sender, EventArgs e)
  2. {
  3. Thread demoThread =new Thread(new ThreadStart(threadMethod));
  4. demoThread.IsBackground = true;
  5. demoThread.Start();//启动线程
  6. }
  7. void threadMethod()
  8. {
  9. Action<String> AsyncUIDelegate=delegate(string n){label1.Text=n;};/<span style="font-family: Arial, Helvetica, sans-serif;">/定义一个委托</span>
  10. label1.Invoke(AsyncUIDelegate,new object[]{"修改后的label1文本"});
  11. }

2.使用SynchronizationContext的Post/Send方法更新

SynchronizationContext类在System.Threading命令空间下,可提供不带同步的自由线程上下文,其中Post方法签名如下:

public virtual void Post(SendOrPostCallback d,Object state)    //将异步消息调度到一个同步上下文

可以看出我们要异步更新UI控件,第一是要获取UI线程的上下文了,第二就是调用post方法了,代码实现:

[csharp] view plain copy
  1. SynchronizationContext _syncContext = null;
  2. private void button6_Click(object sender, EventArgs e)
  3. {
  4. Thread demoThread =new Thread(new ThreadStart(threadMethod));
  5. demoThread.IsBackground = true;
  6. demoThread.Start();//启动线程
  7. }
  8. //窗体构造函数
  9. public Form1()
  10. {
  11. InitializeComponent();
  12. //获取UI线程同步上下文
  13. _syncContext = SynchronizationContext.Current;
  14. }
  15. private void threadMethod()
  16. {
  17. _syncContext.Post(SetLabelText, "修改后的文本");//子线程中通过UI线程上下文更新UI
  18. }
  19. private void SetLabelText(object text)
  20. {
  21. this.lable1.Text = text.ToString();
  22. }

原文链接:http://blog.csdn.net/smilefyx/article/details/47724911

C#子线程中更新ui相关推荐

  1. android 不能在子线程中更新ui的讨论和分析

    问题描述 做过android开发基本都遇见过 ViewRootImpl$CalledFromWrongThreadException,上网一查,得到结果基本都是只能在主线程中更改 ui,子线程要修改 ...

  2. 为什么不能在子线程中更新UI

    首先声明一点:子线程里面是可以更新UI的--创建一个空白的Activity,在其xml文件中放一个空白TextView,Java代码如下: @Override protected void onCre ...

  3. Android子线程中更新UI的4种方法

    方法一:用Handler 1.主线程中定义Handler: Handler mHandler = new Handler() { @Override public void handleMessage ...

  4. 子线程中更新UI线程的三个方法

    1.通过handler方式,sendmessage. 多个类间传递比较麻烦,也懒的写... 2.线程中通过runOnUiThread() new Thread() { public void run( ...

  5. android-如何在子线程中更新ui

    参考:https://blog.csdn.net/u013356254/article/details/52287794 实现基本跟链接相同,不同只出在于WindowManager.LayoutPar ...

  6. 【源码】让源码告诉你:为什么在子线程无法更新 UI 操作?

    博主声明: 转载请在开头附加本文链接及作者信息,并标记为转载.本文由博主 威威喵 原创,请多支持与指教. 本文首发于此   博主:威威喵  |  博客主页:https://blog.csdn.net/ ...

  7. android 线程 界面,android开发教程之子线程中更新界面

    每个Handler对象与创建它的线程相关联,并且每个Handler对象只能与一个线程相关联. Handler一般有两种用途:1)执行计划任务,你可以再预定的实现执行某些任务,可以模拟定时器.2)线程间 ...

  8. Android中Handler的使用方法——在子线程中更新界面

    本文主要介绍Android的Handler的使用方法.Handler可以发送Messsage和Runnable对象到与其相关联的线程的消息队列.每个Handler对象与创建它的线程相关联,并且每个Ha ...

  9. Android--Handler的使用方法:在子线程中更新界面

    版权声明:本文为博主原创文章,转载请标明出处. https://blog.csdn.net/chaoyu168/article/details/50914021 本文主要介绍Android的Handl ...

最新文章

  1. lightoj 1014
  2. 使用好的工程实践交付可交付产品
  3. CentOS下的抓包服务:rpcapd(WinPcap)
  4. VMware Converter P2V 时,卡住
  5. MongoDB开发环境搭建(windows)
  6. 360金融新任首席科学家:别指望AI Lab做成中台
  7. python怎么读取csv文件-python如何读取csv数据
  8. 使用Intent启动常用的应用与服务
  9. VCenter 5.5 数据库过大造成的问题和解决方法
  10. qtcreator 代码格式化工具使用
  11. 小红伞杀毒软件|小红伞杀毒软件下载
  12. 云更新网吧系统服务器,云更新2021最新版安装视频教程/网吧无盘系统/万能包PNP驱动...
  13. IOS成长之路-使用系统默认声音、震动
  14. javascript call callee
  15. oracle导出表为excel文件路径,Oracle导出数据为excel或文本文件
  16. 大于或小于100万,1000万,1亿,10亿,1000亿,万亿,亿亿,10亿亿,100亿亿上下的10个质数(素数)...
  17. 商务团队建设PPT模板
  18. python弹窗处理_python弹窗处理
  19. GitHub Desktop 安装和使用(附:百度云下载地址,永久有效)
  20. 汇编语言-第三版-王爽-实验6、7、9、10、11、12、13、14、15

热门文章

  1. UA OPTI570 量子力学26 无自旋的氢原子
  2. SQL group by 和 order by 、where、having
  3. Java struts 2 源码阅读入门
  4. 掌握测试驱动开发的3个关键因素(译)
  5. [sh]top添加到crontab不生效问题解决
  6. Hibernate Annotation _List/Map
  7. Jquery的ajax在IE提交数据乱码解决方法
  8. poj 2482 Stars in Your Window (线段树扫描线)
  9. lamp架构之升级php版本
  10. 005_控制器和动作