简短总结一下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/candyzhmm/p/5784130.html
简短总结一下C#里跨线程更新UI(转)相关推荐
- 简短总结一下C#里跨线程更新UI
简短总结一下C#里跨线程更新UI 摘自: http://my.oschina.net/sdqxcxh/blog/53707 跨线程更新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.前言 看完<你为什么在现在的公司不 ...
最新文章
- Nature突破:首个比头发丝还细的机器人诞生了!可用针头注射入人体
- windows环境下如何安装memcached教程
- 三维视觉传感器的类型
- visual studio学习python_一步一步学Python3(小学生也适用) 第三篇: Visual Studio Code
- 【Tuxedo】Tuxedo入门
- jQuery实现轮播图--入门
- JSP→Javabean简介设计原则、JSP动作、Javabean三个动作、Javabean四个作用域范围、Model1简介弊端、JSP状态管理、include动作指令、forword动作、param
- NodeJs(尚硅谷视频学习笔记)
- jsp汽车4S店维修管理系统
- HttpClientHelper
- 5G前传从无源到半有源平滑演进解决方案
- 关于element upload上传时额外参数的问题
- HDU 1107 武林 大模拟
- omap_i2c omap_i2c.2: controller timed out
- 有源电场与无源磁场与麦克斯韦方程
- 线段树(区间修改)模板题 Luogu 2357 守墓人
- CSS实现步骤进度条——前端每日一练
- android 调用搜狗地图api,sogou地图API用法实例教程
- Java JDBC和数据库连接池 韩顺平老师自学笔记
- JAVA后端生成类似于分享海报图片的功能的实现
热门文章
- linux安装jdk8和tomcat8
- Maven详解及相关操作
- java算法知识点_Java知识点梳理——数据结构与算法
- 移除类名没有触发transition_epoll边缘触发模式
- MapReduce框架下的FP Growth算法详解
- 手机wps列怎样转成行_为什么有人不用免费的WPS,偏要花钱用Office?看完这些就知道了...
- java api文档_JAVA浏览器控件JxBrowser v7.3上线!最新API文档打包带走
- Vue cli3使用vue-awesome-swiper
- 三大系列总结(offset client scroll)
- kafka/producer.lua:168: attempt to perform arithme