1. 使用UI线程的SynchronizationContext的Post/Send方法,这种情况一般在窗体构造函数或者FormLoad中获取同步上下文;

范例:

  1. public partial class Form1 : Form
  2. {
  3. SynchronizationContext SyncContext = null;
  4. public Form1()
  5. {
  6. InitializeComponent();
  7. //获取UI线程同步上下文
  8. SyncContext = SynchronizationContext.Current;
  9. }
  10. private void btnOk_Click(object sender, EventArgs e)
  11. {
  12. ThreadPool.QueueUserWorkItem(d=> {
  13. //模拟耗时操作
  14. Thread.Sleep(1000);
  15. SyncContext.Post(m => {
  16. var result = m as string;
  17. txtName.Text = result;
  18. }, "异步操作完成结果");
  19. });
  20. }
  21. }
  1. public partial class Form1 : Form
  2. {
  3. SynchronizationContext SyncContext = null;
  4. public Form1()
  5. {
  6. InitializeComponent();
  7. //获取UI线程同步上下文
  8. SyncContext = SynchronizationContext.Current;
  9. }
  10. private void btnOk_Click(object sender, EventArgs e)
  11. {
  12. ThreadPool.QueueUserWorkItem(d=> {
  13. //模拟耗时操作
  14. Thread.Sleep(1000);
  15.  
  16. SyncContext.Send(m =>
  17. {
  18. var result = m as string;
  19. txtName.Text = result;
  20. }, "异步操作完成结果2");
  21. });
  22. }
  23. }

2、使用Control的Invoke/BegainInvoke方法更新;

范例:

  1. public partial class Form1 : Form
  2. {
  3. // SynchronizationContext SyncContext = null;
  4. public Form1()
  5. {
  6. InitializeComponent();
  7. //获取UI线程同步上下文
  8. //SyncContext = SynchronizationContext.Current;
  9. }
  10. private void btnOk_Click(object sender, EventArgs e)
  11. {
  12. ThreadPool.QueueUserWorkItem(d=> {
  13. //模拟耗时操作
  14. Thread.Sleep();
  15.  
  16. if (txtName.InvokeRequired)
  17. {
  18. txtName.Invoke(new Action<Control, string>((ctrl, data) => {
  19. ctrl.Text = data;
  20. }), new object[] { txtName, "异步操作完成结果3" });
  21. }
  22. else
  23. {
  24. txtName.Text = "异步操作完成结果3";
  25. }
  26. });
  27. }
  28. }

C#多线程下更新UI的几种方法的更多相关文章

  1. 转:探讨android更新UI的几种方法

    本文转自:http://www.cnblogs.com/wenjiang/p/3180324.html 作为IT新手,总以为只要有时间,有精力,什么东西都能做出来.这种念头我也有过,但很快就熄灭了,因 ...

  2. 【转】探讨android更新UI的几种方法----不错

    原文网址:http://www.cnblogs.com/wenjiang/p/3180324.html 作为IT新手,总以为只要有时间,有精力,什么东西都能做出来.这种念头我也有过,但很快就熄灭了,因 ...

  3. 探讨android更新UI的几种方法

    作为IT新手,总以为只要有时间,有精力,什么东西都能做出来.这种念头我也有过,但很快就熄灭了,因为现实是残酷的,就算一开始的时间和精力非常充足,也会随着项目的推进而逐步消磨殆尽.我们会发现,自己越来越 ...

  4. 探讨android更新UI的几种方法(转)

    作为IT新手,总以为只要有时间,有精力,什么东西都能做出来.这种念头我也有过,但很快就熄灭了,因为现实是残酷的,就算一开始的时间和精力非常充足,也会随着项目的推进而逐步消磨殆尽.我们会发现,自己越来越 ...

  5. Android 在子线程中更新UI的几种方法

    第一种: new Handler(context.getMainLooper()).post(new Runnable() { @Override public void run() { // 在这里 ...

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

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

  7. Android更新UI的几种方法

    在Android开发过程中,常需要更新界面的UI.比如网络请求操作.一些耗时操作都不能放在UI线程中运行的,需要放在子线程,而子线程又不能更新UI界面,这是我们需要引入一个Handler,消息处理机制 ...

  8. 我的Android最佳实践之—— Android更新UI的两种方法:handler与runOnUiThread()

    在Android开发过程中,常需要更新界面的UI.而更新UI是要主线程来更新的,即UI线程更新.如果在主线线程之外的线程中直接更新页面 显示常会报错.抛出异常:android.view.ViewRoo ...

  9. Android更新UI的两种方法——handler与runOnUiThread()

    在Android开发过程中,常需要更新界面的UI.而更新UI是要主线程来更新的,即UI线程更新.如果在主线线程之外的线程中直接更新页面 显示常会报错.抛出异常:android.view.ViewRoo ...

随机推荐

  1. 多线程--future模式初体验

    第一次使用多线程,虽然理解的不是很透彻,但是也值得记录下.用的是future模式. 创建个线程池:private ExecutorService cachedThreadPool = Executor ...

  2. JPA学习(一、JPA_Hello World)

    框架学习之JPA(一) JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中 ...

  3. VSCode支持jsx自动补全

    点击settings.json中编辑, 把这段话加上去就可以了 "emmet.includeLanguages": { "javascript": " ...

  4. 苹果cms开启防红跳转后,提示模板文件不存在解决方法

    1,苹果cms开启防红跳转后,提示模板文件不存在(如下图)这是因为你使用的模板里面缺少苹果cms自带的防红跳转模板导致,遇到这种状况后需要把苹果cms默认自带的( template/default_p ...

  5. springboot(一).初识springboot以及基本项目搭建

    初识springboot 以及基本项目搭建 由于新的项目需要搭建后台框架,之前的springmvc架构也使用多次,在我印象中springboot的微服务架构更轻量级更容易搭建,所以想去试试spring ...

  6. [BZOJ4237]稻草人:CDQ分治+单调栈

    分析 按\(y\)排序后CDQ分治,可以发现每个点可以影响的是\(x\)坐标的一段区间,可以使用扫描线+单调栈,在单调栈上二分即可解决,时间复杂度\(O(n \log^2 n)\). 通过归并排序可以 ...

  7. sql中left join、right join、inner join的区别

    转自https://www.cnblogs.com/pcjim/articles/799302.html left  join.right join.inner join区别 left join(左联 ...

  8. aws常用命令

    EC2 挂载 EBS linux 查看块设备: lsblk 格式化磁盘: sudo mkfs -t ext4 /dev/xvdb 挂载卷: sudo mount /dev/xvdb /mnt/mydi ...

  9. Hive分析窗口函数(一) SUM,AVG,MIN,MAX

    Hive分析窗口函数(一) SUM,AVG,MIN,MAX Hive分析窗口函数(一) SUM,AVG,MIN,MAX Hive中提供了越来越多的分析函数,用于完成负责的统计分析.抽时间将所有的分析窗 ...

  10. 通过jedis连接redis单机成功,使用redis客户端可以连接集群,但使用JedisCluster连接redis集群一直报Could not get a resource from the pool

    一,问题描述: (如题目)通过jedis连接redis单机成功,使用JedisCluster连接redis集群一直报Could not get a resource from the pool 但是使 ...