简短总结一下C#里跨线程更新UI
摘自: http://my.oschina.net/sdqxcxh/blog/53707
跨线程更新UI是写多线程程序尤其是通信类的程序经常遇到的问题,这里面主要的问题是冲突,比如数据线程想要更新UI的时候,用户同时也在更新UI,就会出现争用。C#里可以用
Control.CheckForIllegalCrossThreadCalls = false;
来关闭跨线程检测。但是这样做有一定的风险,容易让程序崩溃。
最好的办法是通过Invoke,这篇博客只是提供一个示例,至于那些线程同步、Invoke和BeginInvoke,Invoke底层实现神马的,有空再说吧。
一个简单的例子如下:(注,Form1 加入了一个名为txt的TextBox)
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.Threading;namespace testThread{public partial class Form1 : Form{private delegate void InvokeCallback(string msg); //定义回调函数(代理)格式public Form1(){InitializeComponent();Control.CheckForIllegalCrossThreadCalls = false;//关闭跨线程调用检测MyMessage m = new MyMessage();//一个消息源//启动一个线程,把界面对象传递过去Thread t = new Thread(new ParameterizedThreadStart(m.Test));t.Start((object)this);}//Invoke回调函数public void UpdateText(string text){if (txt.InvokeRequired)//当前线程不是创建线程txt.Invoke(new InvokeCallback(UpdateText),new object[]{text});//回调else//当前线程是创建线程(界面线程)txt.Text = text;//直接更新}}//消息源class MyMessage{public void Test(object para){Form1 form = (Form1)para;form.UpdateText("测试");}} }
上面的例子很简单,主要是需要判断一下当前线程是不是控件的创建线程,如果是就直接更新,否则建立一个Invoke对象,设置好代理和参数,然后调用Invoke。需要注意的是建立线程的时候如果需要传参数,应该通过ParameterizedThreadStart建立并且以object格式传递参数。
转载于:https://www.cnblogs.com/wuyifu/p/4028729.html
简短总结一下C#里跨线程更新UI相关推荐
- 简短总结一下C#里跨线程更新UI(转)
摘自: http://my.oschina.net/sdqxcxh/blog/53707 跨线程更新UI是写多线程程序尤其是通信类的程序经常遇到的问题,这里面主要的问题是冲突,比如数据线程想要更新UI ...
- C# Winform 跨线程更新UI控件常用方法汇总(多线程访问UI控件)
概述 C#Winform编程中,跨线程直接更新UI控件的做法是不正确的,会时常出现"线程间操作无效: 从不是创建控件的线程访问它"的异常.处理跨线程更新Winform UI控件常用 ...
- [转]C#利用委托跨线程更新UI数据
在使用C#的过程中,难免会用到多线程,而用多线程之后,线程如何与界面交互则是一个非常头疼的问题.其实不仅仅是界面,一般情况下,我们往往需要获得线程的一些信息来确定线程的状态.比较好的方式是用委托实现, ...
- C#-WinForm跨线程修改UI界面
背景 在我做WinForm开发的过程中,经常会遇到耗时操作或阻塞操作.他们会引发软件的卡顿甚至假死,严重影响软件的使用.因此,这类耗时或阻塞的操作一般都会使用异步的方式去执行,不影响主线程(UI线程) ...
- 同步上下文(SynchronizationContext) 和 C#中跨线程更新UI的方法总结
同步上下文(SynchronizationContext) 和 C#中跨线程更新UI的方法总结 在C#编程环境中,不允许在工作线程中直接对主线程(UI线程)中的控件进行更新操作.因此,稍微复杂一点的程 ...
- 经验证过的跨线程更新辅助类MyInvokeHelper
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- C#跨线程更新控件(UI)使用delegate方式
C#跨线程更新(获取)控件(UI)使用delegate方式 在做界面开发的时候经常用到多线程,并且要在work线程中对控件或者界面进行操作,下面给出几种常用的操作方法 使用匿名委托到主线程中进行UI异 ...
- android remoteviews 设置背景,Android通过RemoteViews实现跨进程更新UI示例
一.概述 前面一篇文章Android通过AIDL实现跨进程更新UI我们学习了aidl跨进程更新ui,这种传统方式实现跨进程更新UI是可行的,但有以下弊端: View中的方法数比较多,在IPC中需要增加 ...
- 面试官问我:Andriod为什么不能在子线程更新UI?
记得看文章三部曲,点赞,评论,转发. 微信搜索[程序员小安]关注还在移动开发领域苟活的大龄程序员,"面试系列"文章将在公众号同步发布. 1.前言 看完<你为什么在现在的公司不 ...
最新文章
- 生成网页没有标题_网页设计公司有哪些?用这个快速建站!
- log4j 配置文件_Log4j系列教材 (三)- log4j.xml
- java中 若干,Java中的随机数发生器。产生若干的复杂性
- Java bitset转string_将java BitSet保存到DB
- Git版本管理工具常用命令整理和说明
- 工具的使用——电脑的认识与使用
- 生物计算机的发展和应用,计算机的发展及其在生物医学中的应用
- slf4j-api slf4j-log4j12以及log4j之间的关系
- 963B:Destruction of a Tree
- PHP exit()与die()的区别
- 波形信号发生器设计 Proteus仿真--输出频率可调的正弦波、三角波、方波
- phpwind9.0 read.php 修改,phpwind 9.0后台执行任意php代码
- 如何选择一款程序员理想中的显示器
- 代码要写注释吗?写你就输了
- 360 随身wifi安装服务器系统,win7系统无法安装360随身WiFi的解决方法
- JAVA Swing界面美化 -付费界面库
- Scratch软件编程等级考试一级——20210320
- Mac OS 版本历史
- 日常生活收缩毛孔几个小妙招 - 生活至上,美容至尚!
- excel表计算机实践操作,Excel电子表格计算机实践任务书
热门文章
- fastjson中@JSONType的使用-排除字段
- element ui border表头设置背景颜色
- 多activity中退出整个程序
- Mysql多表关联删除操作
- [转载] 七龙珠第一部——第084话 天下第一高手
- arch开机自动认证
- 在Biztalk应用中调用程序集的方法
- Castle ActiveRecord学习实践(7):使用HQL查询
- java脚本项目_java项目部署脚本 - xixingzhe的个人空间 - OSCHINA - 中文开源技术交流社区...
- flash动画制作成品_Flash如何制作沿曲线移动的箭头动画