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

范例:

 public partial class Form1 : Form
{
SynchronizationContext SyncContext = null;
public Form1()
{
InitializeComponent();
//获取UI线程同步上下文
SyncContext = SynchronizationContext.Current;
}
private void btnOk_Click(object sender, EventArgs e)
{
ThreadPool.QueueUserWorkItem(d=> {
//模拟耗时操作
Thread.Sleep(1000);
SyncContext.Post(m => {
var result = m as string;
txtName.Text = result;
}, "异步操作完成结果");
});
}
}
public partial class Form1 : Form
{
SynchronizationContext SyncContext = null;
public Form1()
{
InitializeComponent();
//获取UI线程同步上下文
SyncContext = SynchronizationContext.Current;
}
private void btnOk_Click(object sender, EventArgs e)
{
ThreadPool.QueueUserWorkItem(d=> {
//模拟耗时操作
Thread.Sleep(1000); SyncContext.Send(m =>
{
var result = m as string;
txtName.Text = result;
}, "异步操作完成结果2");
});
}
}

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

范例:

 public partial class Form1 : Form
{
// SynchronizationContext SyncContext = null;
public Form1()
{
InitializeComponent();
//获取UI线程同步上下文
//SyncContext = SynchronizationContext.Current;
}
private void btnOk_Click(object sender, EventArgs e)
{
ThreadPool.QueueUserWorkItem(d=> {
//模拟耗时操作
Thread.Sleep(); if (txtName.InvokeRequired)
{
txtName.Invoke(new Action<Control, string>((ctrl, data) => {
ctrl.Text = data;
}), new object[] { txtName, "异步操作完成结果3" });
}
else
{
txtName.Text = "异步操作完成结果3";
}
});
}
}

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. MoreExecutors工具类使用

    MoreExecutors是guava提供的工具类,是对jdk自带的Executors工具类的扩展,主要方法如下: 1.addDelayedShutDown()方法的两个重载: public stat ...

  2. UVa 11235 Frequent values (RMQ && 区间出现最多次的数的次数)

    题意 : 给出一个长度为 n 的不降序序列,并且给出 q 个形如(L, R)的问询,问你这个区间出现的最多次的数的次数. 分析 : 很自然的想到将区间“缩小”,例如1 1 2 3 3 3就可以变成2 ...

  3. Windows Server 部署WEB API时内部错误

    Windows Server 部署WEB API时,发生HTTP 错误 500.21 - Internal Server Error,如图所示: 错误原因:IIS注册Framework4.0 解决方法 ...

  4. 2-sat问题简记

    关于2-sat问题,这里笔者主要是做一些简记,如要详细了解,可以读一读此dalao的文章:https://blog.csdn.net/jarjingx/article/details/8521690 ...

  5. 使用私有仓库(Docker Registry 2.0)管理镜像

    1. 执行以下命令新建并启动一个Docker Registry 2.0 docker run -d -p 5000:5000 --restart=always --name registry2 reg ...

  6. spring cloud:config-eureka-refresh

    config-server-eureka project 1. File-->new spring project 2.add dependency <parent> <gro ...

  7. Chrome 抓包:快速定位HTTP协议问题

    标签(空格分隔): 快速定位HTTP协议问题 Chrome:快速定位HTTP协议问题 快捷键:control+shift+i(windows),command+option+i(mac) 控制器: 控 ...

  8. RAC+单实例场景下 DG主备切换,报ORA-01577

    SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMAR ...

  9. SpringBoot -- 配置mysql、hibernate

    # application.properties# Server settings (ServerProperties)server.port=8081server.address=127.0.0.1 ...

  10. python-应用OpenCV和Python进行SIFT算法的实现

    如下图为进行测试的q和h,分别验证基于BFmatcher.FlannBasedMatcher等的SIFT算法 代码如下: import numpy as np import cv2 from matp ...