与在Android中一样, 子线程中更新UI被认为是线程不安全的, 会抛出异常.

子线程返回UI线程中更新UI的一个方法为:

1, 捕获应用的UI线程的上下文;

2, 定义线程任务;

3, 定义线程任务中用于回调的进行UI更新的方法(接受一个object参数);

4, 开启线程;

Form1.cs
using System;
using System.Windows.Forms;
using System.Threading; namespace WeChatRobot
{
public partial class mainContainer : Form
{ // 用于返回UI线程更新UI的上下文
private SynchronizationContext mSynchronizationContext = null;
private Thread mSetQRCodeThread = null;
private string mQrCodeSavePath = "D:\\Temp\\tmp.jpg"; // 线程任务
private void UpdateQRCodePost()
{
DateTime epoch = new DateTime(1970, 1, 1);
var startTimeMillis = (long)(DateTime.UtcNow - epoch).TotalMilliseconds;
while (true)
{
if (System.IO.File.Exists(mQrCodeSavePath))
{
mSynchronizationContext.Post(setQRCodePicture, true);
break;
}
else if ((long)(DateTime.UtcNow - epoch).TotalMilliseconds - startTimeMillis > 15000)
{
mSynchronizationContext.Post(setQRCodePicture, false);
break;
}
Thread.Sleep(1000);
}
} // 用于更新UI的回调方法, 注意方法签名, 有一个接受object的参数
private void setQRCodePicture(object successOrNot)
{
if (true == (bool)successOrNot)
{
qrCodePictureBox.ImageLocation = mQrCodeSavePath;
hintLabel.Text = "请用微信扫描上方二维码进行登陆!";
}
else
{
hintLabel.Text = "二维码生成失败! 请重启程序!";
DialogResult result = MessageBox.Show("二维码生成失败! 请重启程序!", "WeChatRobot");
if (DialogResult.OK == result)
{
Environment.Exit(0);
}
}
} public mainContainer()
{
InitializeComponent(); // 捕获主线程上下文
mSynchronizationContext = SynchronizationContext.Current; // 开启线程
mSetQRCodeThread = new Thread(new ThreadStart(UpdateQRCodePost));
mSetQRCodeThread.Start();
} private void mainContainer_Load(object sender, EventArgs e)
{ } private void qrCodePictureBox_Click(object sender, EventArgs e)
{ } private void hintLabel_Click(object sender, EventArgs e)
{ } private void settingButton_Click(object sender, EventArgs e)
{ }
}
}

C# WinForms跨线程更新 UI的更多相关文章

  1. C# 跨线程更新 UI

    Winforms 跨线程更新 UI 在 Winforms 中, 所有的控件都包含 InvokeRequired 属性, 如果我们要更新UI,通过它我们可以判断是否需要调用 [Begin]Invoke. ...

  2. 简短总结一下C#里跨线程更新UI(转)

    摘自: http://my.oschina.net/sdqxcxh/blog/53707 跨线程更新UI是写多线程程序尤其是通信类的程序经常遇到的问题,这里面主要的问题是冲突,比如数据线程想要更新UI ...

  3. (转).NET 4.5中使用Task.Run和Parallel.For()实现的C# Winform多线程任务及跨线程更新UI控件综合实例

    http://2sharings.com/2014/net-4-5-task-run-parallel-for-winform-cross-multiple-threads-update-ui-dem ...

  4. 简短总结一下C#里跨线程更新UI

    摘自: http://my.oschina.net/sdqxcxh/blog/53707 跨线程更新UI是写多线程程序尤其是通信类的程序经常遇到的问题,这里面主要的问题是冲突,比如数据线程想要更新UI ...

  5. C# Winform 跨线程更新UI控件常用方法汇总(多线程访问UI控件)

    概述 C#Winform编程中,跨线程直接更新UI控件的做法是不正确的,会时常出现“线程间操作无效: 从不是创建控件的线程访问它”的异常.处理跨线程更新Winform UI控件常用的方法有4种:1. ...

  6. C# Winform 跨线程更新UI控件常用方法总结(转)

    出处:http://www.tuicool.com/articles/FNzURb 概述 C#Winform编程中,跨线程直接更新UI控件的做法是不正确的,会时常出现“线程间操作无效: 从不是创建控件 ...

  7. Winform之跨线程更新UI

    Winform之跨线程更新UI 使用`Invoke`或者`BeginInvoke`与UI线程交互示例 参考及源码 使用Invoke或者BeginInvoke与UI线程交互示例 private void ...

  8. C#利用委托跨线程更新UI数据

    转:http://www.2cto.com/kf/201206/136587.html 在使用C#的过程中,难免会用到多线程,而用多线程之后,线程如何与界面交互则是一个非常头疼的问题.其实不仅仅是界面 ...

  9. C# 跨线程更新UI界面的适当的处理方式,友好的退出界面的机制探索

    本文主要讲讲C#窗体的程序中一个经常遇到的情况,就是在退出窗体的时候的,发生了退出的异常. 工业软件技术交流群:群1:592132877(满)  群2:948305931     欢迎技术探讨 我们先 ...

随机推荐

  1. 【FPGA】Quartus导出.qxp格式的网表文件

    首先,右击项目顶层文件. 选择Design Partition -> Export Design Partition 即可完成.

  2. Navicat for MySQL导入文件

    1.导入SQL文件超出Navicat限制时,需要设置其限制的大小(具体看SQL文件大小) 打开Navicat For MySQL的命令行界面,输入: set global max_allowed_pa ...

  3. PHP : 封装跳转函数,实现三个页面的跳转

    具体实现:有a,b两个页面,一个跳转页面c,在a执行完后先进行c页面的提示,再跳转到b 1.文件设计: 2.c页面封装方法内容(function.php): a页面内容(a.html): a页面的后台 ...

  4. naive bayes classifier in data mining

    https://www-users.cs.umn.edu/~kumar001/dmbook/slides/chap4_naive_bayes.pdf  -- textbook https://www. ...

  5. [转载]Memcached缓存服务的简单安装

    1.Linux下的安装方法 下载:wget http://memcached.org/latest tar -zxvf memcached-1.x.x.tar.gz cd memcached-1.x. ...

  6. 2017.9.24 基于HTML+JavaScript+CSS的开发案例&&JavaScript+CSS+DIV实现表格变色

    1.JavaScript+CSS+DIV实现下拉菜单 1.1 层标签<div> 基本语法: <div id="层编号" style="position: ...

  7. 20145238-荆玉茗 《Java程序设计》第7周学习总结

    20145238 <Java程序设计>第7周学习总结 教材学习内容总结 第13章时间与日期 13.1.1 ·即使标注为GMT(格林威治时间),实际上谈到的的是UTC(Unix时间)时间. ...

  8. DOM——获取元素的方式

    document.getElementById("id属性的值"): //可以通过元素的 id 来获取元素,返回的是一个元素对象 document.getElementByName ...

  9. 数据库可视化工具简介以及pymysql的使用

    1.可视化工具Navicat 我们自己开发测试时,可以使用该可视化工具,以图形界面的形式操作数据库 在生产环境中,为了显示自己的逼格,一般不建议使用它 官网下载:https://www.navicat ...

  10. 数据库MySQL基本介绍安装使用及文件导入导出

    1.数据库(data base) 1.1 简述 把文件存储在一台电脑上(服务器),其他电脑用户可以通过账号密码登陆,通过网络去访问这台电脑上的文件,但是由于每个人的数据是不同的,所以你只能通过自己的账 ...