简短总结一下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格式传递参数。

posted on 2014-10-16 14:30 Alfa 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/wuyifu/p/4028729.html

简短总结一下C#里跨线程更新UI相关推荐

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

    摘自: http://my.oschina.net/sdqxcxh/blog/53707 跨线程更新UI是写多线程程序尤其是通信类的程序经常遇到的问题,这里面主要的问题是冲突,比如数据线程想要更新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. 生成网页没有标题_网页设计公司有哪些?用这个快速建站!
  2. log4j 配置文件_Log4j系列教材 (三)- log4j.xml
  3. java中 若干,Java中的随机数发生器。产生若干的复杂性
  4. Java bitset转string_将java BitSet保存到DB
  5. Git版本管理工具常用命令整理和说明
  6. 工具的使用——电脑的认识与使用
  7. 生物计算机的发展和应用,计算机的发展及其在生物医学中的应用
  8. slf4j-api slf4j-log4j12以及log4j之间的关系
  9. 963B:Destruction of a Tree
  10. PHP exit()与die()的区别
  11. 波形信号发生器设计 Proteus仿真--输出频率可调的正弦波、三角波、方波
  12. phpwind9.0 read.php 修改,phpwind 9.0后台执行任意php代码
  13. 如何选择一款程序员理想中的显示器
  14. 代码要写注释吗?写你就输了
  15. 360 随身wifi安装服务器系统,win7系统无法安装360随身WiFi的解决方法
  16. JAVA Swing界面美化 -付费界面库
  17. Scratch软件编程等级考试一级——20210320
  18. Mac OS 版本历史
  19. 日常生活收缩毛孔几个小妙招 - 生活至上,美容至尚!
  20. excel表计算机实践操作,Excel电子表格计算机实践任务书

热门文章

  1. fastjson中@JSONType的使用-排除字段
  2. element ui border表头设置背景颜色
  3. 多activity中退出整个程序
  4. Mysql多表关联删除操作
  5. [转载] 七龙珠第一部——第084话 天下第一高手
  6. arch开机自动认证
  7. 在Biztalk应用中调用程序集的方法
  8. Castle ActiveRecord学习实践(7):使用HQL查询
  9. java脚本项目_java项目部署脚本 - xixingzhe的个人空间 - OSCHINA - 中文开源技术交流社区...
  10. flash动画制作成品_Flash如何制作沿曲线移动的箭头动画