C# WinForms跨线程更新 UI
与在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的更多相关文章
- C# 跨线程更新 UI
Winforms 跨线程更新 UI 在 Winforms 中, 所有的控件都包含 InvokeRequired 属性, 如果我们要更新UI,通过它我们可以判断是否需要调用 [Begin]Invoke. ...
- 简短总结一下C#里跨线程更新UI(转)
摘自: http://my.oschina.net/sdqxcxh/blog/53707 跨线程更新UI是写多线程程序尤其是通信类的程序经常遇到的问题,这里面主要的问题是冲突,比如数据线程想要更新UI ...
- (转).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 ...
- 简短总结一下C#里跨线程更新UI
摘自: http://my.oschina.net/sdqxcxh/blog/53707 跨线程更新UI是写多线程程序尤其是通信类的程序经常遇到的问题,这里面主要的问题是冲突,比如数据线程想要更新UI ...
- C# Winform 跨线程更新UI控件常用方法汇总(多线程访问UI控件)
概述 C#Winform编程中,跨线程直接更新UI控件的做法是不正确的,会时常出现“线程间操作无效: 从不是创建控件的线程访问它”的异常.处理跨线程更新Winform UI控件常用的方法有4种:1. ...
- C# Winform 跨线程更新UI控件常用方法总结(转)
出处:http://www.tuicool.com/articles/FNzURb 概述 C#Winform编程中,跨线程直接更新UI控件的做法是不正确的,会时常出现“线程间操作无效: 从不是创建控件 ...
- Winform之跨线程更新UI
Winform之跨线程更新UI 使用`Invoke`或者`BeginInvoke`与UI线程交互示例 参考及源码 使用Invoke或者BeginInvoke与UI线程交互示例 private void ...
- C#利用委托跨线程更新UI数据
转:http://www.2cto.com/kf/201206/136587.html 在使用C#的过程中,难免会用到多线程,而用多线程之后,线程如何与界面交互则是一个非常头疼的问题.其实不仅仅是界面 ...
- C# 跨线程更新UI界面的适当的处理方式,友好的退出界面的机制探索
本文主要讲讲C#窗体的程序中一个经常遇到的情况,就是在退出窗体的时候的,发生了退出的异常. 工业软件技术交流群:群1:592132877(满) 群2:948305931 欢迎技术探讨 我们先 ...
随机推荐
- HTML超链接实用
1.文本链接: <a href="http://www.meng.com/" target="_blank">访问meng!</a> 2 ...
- orientationchange事件
orientationchange事件 resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize':
- Cloud Computing
More numbers, More power. We waste much more every day. Everything can be connectible through specia ...
- 【起航计划 028】2015 起航计划 Android APIDemo的魔鬼步伐 27 App->Preferences->Launching preferences 其他activity获取Preference中的值
前给例子介绍了如何使用PreferenceActivity 来显示修改应用偏好,用户对Preferences的修改自动存储在应用对应的Shared Preferences中. 本例介绍了如何从一个Ac ...
- u-boot分析(九)----nand flash初始化|nand flash读写分析
u-boot分析(九) 上篇博文我们按照210的启动流程,分析到了初始化串口,由于接下来的取消存储保护不是很重要,所以我们今天按照u-boot的启动流程对nand flash初始化进行分析. 今天我们 ...
- Java 空对象设计模式(Null Object Pattern) 讲解
转自:http://www.cnblogs.com/haodawang/articles/5962531.html 有时候我们的代码中为避免 NullPointerException 会出现很多的对N ...
- Xapian简明教程(未完成)
第一章 简介 1.1 简介 Xapian是一个开源的搜索引擎库,它可以让开发者自定义的开发一些高级的的索引和查找因素应用在他们的应用中. 通过阅读这篇文档,希望可以帮助你创建第一个你的索引数据库和了解 ...
- js 去掉指定符号的字符串做法
//去掉字符串末尾指定符号 function RemoveSymbol(str, symbol) { if (str.charAt(str.length - 1) == symbol) { str = ...
- 2018年Linux运维人员必会开源运维工具体系总结
操作系统:Centos,Ubuntu,Redhat,suse,Freebsd 网站服务:nginx,apache,lighttpd,php,tomcat,resin数据库:MySQL,MariaDB, ...
- 近期流行的JavaScript框架与主题
[新年快乐]2017年你应该关注的JavaScript框架与主题 2017-01-01 王下邀月熊 JavaScript JavaScript的繁荣促生了很多优秀的技术.框架与工具库,这空前的繁荣也给 ...