摘自: 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(转)相关推荐

  1. 简短总结一下C#里跨线程更新UI

    简短总结一下C#里跨线程更新UI 摘自: http://my.oschina.net/sdqxcxh/blog/53707 跨线程更新UI是写多线程程序尤其是通信类的程序经常遇到的问题,这里面主要的问 ...

  2. C# Winform 跨线程更新UI控件常用方法汇总(多线程访问UI控件)

    概述 C#Winform编程中,跨线程直接更新UI控件的做法是不正确的,会时常出现"线程间操作无效: 从不是创建控件的线程访问它"的异常.处理跨线程更新Winform UI控件常用 ...

  3. [转]C#利用委托跨线程更新UI数据

    在使用C#的过程中,难免会用到多线程,而用多线程之后,线程如何与界面交互则是一个非常头疼的问题.其实不仅仅是界面,一般情况下,我们往往需要获得线程的一些信息来确定线程的状态.比较好的方式是用委托实现, ...

  4. C#-WinForm跨线程修改UI界面

    背景 在我做WinForm开发的过程中,经常会遇到耗时操作或阻塞操作.他们会引发软件的卡顿甚至假死,严重影响软件的使用.因此,这类耗时或阻塞的操作一般都会使用异步的方式去执行,不影响主线程(UI线程) ...

  5. 同步上下文(SynchronizationContext) 和 C#中跨线程更新UI的方法总结

    同步上下文(SynchronizationContext) 和 C#中跨线程更新UI的方法总结 在C#编程环境中,不允许在工作线程中直接对主线程(UI线程)中的控件进行更新操作.因此,稍微复杂一点的程 ...

  6. 经验证过的跨线程更新辅助类MyInvokeHelper

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  7. C#跨线程更新控件(UI)使用delegate方式

    C#跨线程更新(获取)控件(UI)使用delegate方式 在做界面开发的时候经常用到多线程,并且要在work线程中对控件或者界面进行操作,下面给出几种常用的操作方法 使用匿名委托到主线程中进行UI异 ...

  8. android remoteviews 设置背景,Android通过RemoteViews实现跨进程更新UI示例

    一.概述 前面一篇文章Android通过AIDL实现跨进程更新UI我们学习了aidl跨进程更新ui,这种传统方式实现跨进程更新UI是可行的,但有以下弊端: View中的方法数比较多,在IPC中需要增加 ...

  9. 面试官问我:Andriod为什么不能在子线程更新UI?

    记得看文章三部曲,点赞,评论,转发. 微信搜索[程序员小安]关注还在移动开发领域苟活的大龄程序员,"面试系列"文章将在公众号同步发布. 1.前言 看完<你为什么在现在的公司不 ...

最新文章

  1. Nature突破:首个比头发丝还细的机器人诞生了!可用针头注射入人体
  2. windows环境下如何安装memcached教程
  3. 三维视觉传感器的类型
  4. visual studio学习python_一步一步学Python3(小学生也适用) 第三篇: Visual Studio Code
  5. 【Tuxedo】Tuxedo入门
  6. jQuery实现轮播图--入门
  7. JSP→Javabean简介设计原则、JSP动作、Javabean三个动作、Javabean四个作用域范围、Model1简介弊端、JSP状态管理、include动作指令、forword动作、param
  8. NodeJs(尚硅谷视频学习笔记)
  9. jsp汽车4S店维修管理系统
  10. HttpClientHelper
  11. 5G前传从无源到半有源平滑演进解决方案
  12. 关于element upload上传时额外参数的问题
  13. HDU 1107 武林 大模拟
  14. omap_i2c omap_i2c.2: controller timed out
  15. 有源电场与无源磁场与麦克斯韦方程
  16. 线段树(区间修改)模板题 Luogu 2357 守墓人
  17. CSS实现步骤进度条——前端每日一练
  18. android 调用搜狗地图api,sogou地图API用法实例教程
  19. Java JDBC和数据库连接池 韩顺平老师自学笔记
  20. JAVA后端生成类似于分享海报图片的功能的实现

热门文章

  1. linux安装jdk8和tomcat8
  2. Maven详解及相关操作
  3. java算法知识点_Java知识点梳理——数据结构与算法
  4. 移除类名没有触发transition_epoll边缘触发模式
  5. MapReduce框架下的FP Growth算法详解
  6. 手机wps列怎样转成行_为什么有人不用免费的WPS,偏要花钱用Office?看完这些就知道了...
  7. java api文档_JAVA浏览器控件JxBrowser v7.3上线!最新API文档打包带走
  8. Vue cli3使用vue-awesome-swiper
  9. 三大系列总结(offset client scroll)
  10. kafka/producer.lua:168: attempt to perform arithme