与在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. three.js一个简单demo学些和讲解

    叉口裁剪球体案例 二话不说先上效果图: 全部代码带注释 <!DOCTYPE html> <html lang="en"> <head> < ...

  2. <Android 基础(十三)> shape

    介绍 简单来说,shape就是用来在xml文件中定义形状,代码解析之后就可以当做Drawable一样使用 官方说明 关于shape定义的drawable 文件位置:res/drawable/filen ...

  3. python3绘图示例3(基于matplotlib:折线图等)

    #!/usr/bin/env python# -*- coding:utf-8 -*-from pylab import *from numpy import *import numpy # 数据点图 ...

  4. 更改Anaconda中Jupyter的默认文件保存目录

    转载:https://blog.csdn.net/u014552678/article/details/62046638 总结:修改Anaconda中的Jupyter Notebook默认工作路径的三 ...

  5. bootstrap-table 数据表格行内修改

    bootstrap-table 数据行内修改js中设置列的属性 editable : { type : 'text',//数据显示在文本框内 emptytext : "--",// ...

  6. 永恒之蓝EternalBlue复现

    0x01 漏洞原理:http://blogs.360.cn/blog/nsa-eternalblue-smb/ 目前已知受影响的 Windows 版本包括但不限于:Windows NT,Windows ...

  7. linux lnmp搭建

    1.安装nginx: yum install gcc -y yum install -y pcre pcre-devel yum install -y zlib zlib-devel yum inst ...

  8. bzoj4836 [Lydsy2017年4月月赛]二元运算

    Description 定义二元运算 opt 满足 现在给定一个长为 n 的数列 a 和一个长为 m 的数列 b ,接下来有 q 次询问.每次询问给定一个数字 c  你需要求出有多少对 (i, j) ...

  9. python url库学习

    参考资料:http://cuiqingcai.com/947.html urllib,urlib2是python自带的库. urlopen(url,data,timeout),三个参数. 第一个是地址 ...

  10. R 多线程和多节点并行计算

    一:R本身是单线程的,如何让其多线程跑起来,提高运算速度? 用Parallel和foreach包玩转并行计算 看完上面这篇文章就会了.说白了,要加载parallel包,再改写一下自己的代码就ok了. ...