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

  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方法了,代码实现:

    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

最新文章

  1. Servlet学习笔记
  2. PHP编码规范PSR-2
  3. 用jquery.pager.js实现分页
  4. leetcode 155
  5. TaggingJS – 可以灵活定制的 jQuery 标签系统插件
  6. run a Freight robot (2)
  7. 在WPF中显示GIF图片并实现循环播放
  8. Win7显示隐藏文件,隐藏文件夹怎么显示?如何查看?
  9. 死亡的协议--- Pieter Hintjens&#160;(ZeroMQ作者)
  10. 组播MAC地址转换关系及唯一性处理
  11. Ubuntu下安装python相关数据处理
  12. cakephp2.3.0 lib中的Model.php有一个bug
  13. python基础之字典dict和集合set
  14. WebService小记
  15. Lesson 3-2 语句:循环语句
  16. 常用的 jQuery 事件
  17. Response内置对象
  18. bootstrap学习一
  19. obspy下载地震波数据
  20. 第二个spring,第一天

热门文章

  1. Codeforces709
  2. 【BZOJ4828】【HNOI2017】大佬(动态规划)
  3. 洛谷 P2659 美丽的序列 解题报告
  4. Django CRM客户关系管理系统
  5. Linux HugePage 特性
  6. 洛谷P2002 消息扩散
  7. mesos+marathon+zookeeper+docker
  8. Linux遇到的两个问题
  9. Linux常用网络工具:路由扫描之mtr
  10. 「Python-Django」Django中使用数据库的 9 个小技巧