C# 非UI线程对控件的控制】的更多相关文章

第一步:定义委托 public delegate void wei(string ss); 第二步:控制UI的方法 public void get1(string ss) { richTextBox1.Text += ss; } 第三步:定义线程 public void RecMessage() { //线程方法 控件.BeginInvoke(new wei(控制UI方法), new object[] { 参数 }); } 第四步:启动线程 Thread th = new Thread(RecM…
从非UI线程调用UI控件赋值.或进行其他更新UI的操作的话,会出现异常: System.InvalidOperationException:“线程间操作无效: 从不是创建控件“xxx”的线程访问它.” 解决办法: 原来的 xxx.Text="Test"; 换成 xxx.BeginInvoke(new Action(()=>{xxx.Text="Test"})); 使用BeginInvoke解决. 参考:Control的Invoke和BeginInvoke 是相…
首先需要定义一个委托(delegate): private delegate void delegateSetProcessBarVal(int value); 然后定义一个方法来执行具体的操作: private void setProcessBarVal(int value){ this.processBar1.Value = val;} 在需要访问UI线程的时候这样调用: processBar1.BeginInvoke(new delegateSetProcessBarVal(setProc…
前言 在C#开发的WinForm窗体程序开发的时候,经常会使用多线程处理一些比较耗时之类的操作.不过会有一个问题:就是涉及到跨线程操作UI元素. 相信才开始接触的人一定会遇上这个问题. 为了解决这个问题,可以通过委托来实现. 我为了后期使用更加方便,就将常用的几个控件(TextBox.Label.CheckBox.RadioButton.ProgressBar)UI操作进行了封装,源码可以在github上查看:GitHub仓库地址. 源码在github仓库中的XY.WINUI.ControlEx…
转载前,在网上找了好多INVOKE方法的文章,就这个看着还可以,明白了大概,以后再深用的时候再研究 ,废话少说上转载(连转载都说的这么有气势,哈哈)   在设计界面时,我们经常需要将一些需要时间才能完成的操作放在另一个线程(不同于UI主线程)中执行.但是这些操作可能需要将其结果或完成情况通知主线程,比如调用窗体的方法,或者触发事件(由界面响应事件),很多情况下这种通知需要访问控件. 但是如果调用上述方法或者触发事件的线程不是控件的创建进程,Control就不能在创建它的thread之外被访问,此…
    近期自学到了线程这一块,用了一上午的时间终于搞出来了主.子线程间的相互通信.当主线程sendMessage后,子线程便会调用handleMessage来获取你所发送的Message.我的主线程向子线程发送消息时携带了数据,子线程根据主线程发送来的数据进行数据库查询,并将查询后的结果返回给该主线程: public class UpdataPeople extends Activity { EditText updata_name; EditText updata_phone; EditTe…
在设计界面时,我们经常需要将一些需要时间才能完成的操作放在另一个线程(不同于UI主线程)中执行.但是这些操作可能需要将其结果或完成情况通知主线程,比如调用窗体的方法,或者触发事件(由界面响应事件),很多情况下这种通知需要访问控件. 但是如果调用上述方法或者触发事件的线程不是控件的创建进程,Control就不能在创建它的thread之外被访问,此时会引发一个异常,好在可以通过控件的invoke方法来访问它. Windows 窗体中的控件被绑定到特定的线程,不具备线程安全性.因此,如果从另一个线程调…
在.Net中,如果我们在非UI线程上访问窗体上的控件的时候,会产生一个跨线程调用的异常,那么如何处理这种情况呢?在上一章中,我介绍了使用Control.Invoke方法,如果你不习惯使用委托,那么.Net还为我们提供了一个组件BackgroundWorker,你可以使用这个组件,以事件的方式去处理这种跨线程的控件访问.下面我就来详细的介绍一下这个组件的用法. 我们先来看一下BackgroundWorker提供了哪些常用的成员, 事件 DoWork:我们在这个事件中,执行需要异步处理的工作. Pr…
本文的重点在于介绍如何在多线程编程中,从非UI线程上访问界面中的控件.有过多线程编程经验的人都知道,当我们在非UI线程上试图给一个界面中的控件赋值的时候,比如说label的Text属性,系统会抛出一个下面的异常: 这是由于.Net中的大部分控件的实例都是非线程安全的,如果进行跨线程的访问,可能会造成脏数据,所以.Net默认禁止这种跨线程的赋值操作.那要如何解决这个问题呢? 既然.Net禁止跨线程的赋值操作,那么需要给控件赋值的非UI线程就只有将这种赋值的请求传递给UI线程,最终由UI线程完成赋值…
要理解UI线程,先要了解一下“消息循环”这个概念.链接是百度百科上的条目,简单地说,操作系统把用户界面上的每个操作都转化成为对应的消息,加入消息队列.然后把消息转发给对应的应用程序(一般来说,就是活动窗口),应用程序根据自己的逻辑处理这些消息. 如果应用程序处理某个消息事件的时候,用了很长的时间,这时候后续的消息无法及时得到处理,就会造成应用程序没有响应,也就是常说的“假死”状态. 所以,应用程序如果处理某个事件需要较长的时间,需要把这个操作放到一个另外的线程中进行处理. 下面再回顾一下前面的简…