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 欢迎技术探讨 我们先 ...
随机推荐
- three.js一个简单demo学些和讲解
叉口裁剪球体案例 二话不说先上效果图: 全部代码带注释 <!DOCTYPE html> <html lang="en"> <head> < ...
- <Android 基础(十三)> shape
介绍 简单来说,shape就是用来在xml文件中定义形状,代码解析之后就可以当做Drawable一样使用 官方说明 关于shape定义的drawable 文件位置:res/drawable/filen ...
- python3绘图示例3(基于matplotlib:折线图等)
#!/usr/bin/env python# -*- coding:utf-8 -*-from pylab import *from numpy import *import numpy # 数据点图 ...
- 更改Anaconda中Jupyter的默认文件保存目录
转载:https://blog.csdn.net/u014552678/article/details/62046638 总结:修改Anaconda中的Jupyter Notebook默认工作路径的三 ...
- bootstrap-table 数据表格行内修改
bootstrap-table 数据行内修改js中设置列的属性 editable : { type : 'text',//数据显示在文本框内 emptytext : "--",// ...
- 永恒之蓝EternalBlue复现
0x01 漏洞原理:http://blogs.360.cn/blog/nsa-eternalblue-smb/ 目前已知受影响的 Windows 版本包括但不限于:Windows NT,Windows ...
- linux lnmp搭建
1.安装nginx: yum install gcc -y yum install -y pcre pcre-devel yum install -y zlib zlib-devel yum inst ...
- bzoj4836 [Lydsy2017年4月月赛]二元运算
Description 定义二元运算 opt 满足 现在给定一个长为 n 的数列 a 和一个长为 m 的数列 b ,接下来有 q 次询问.每次询问给定一个数字 c 你需要求出有多少对 (i, j) ...
- python url库学习
参考资料:http://cuiqingcai.com/947.html urllib,urlib2是python自带的库. urlopen(url,data,timeout),三个参数. 第一个是地址 ...
- R 多线程和多节点并行计算
一:R本身是单线程的,如何让其多线程跑起来,提高运算速度? 用Parallel和foreach包玩转并行计算 看完上面这篇文章就会了.说白了,要加载parallel包,再改写一下自己的代码就ok了. ...