【转】C#中Invoke的用法

摘要:
在多线程编程中,我们经常需要更新工作线程中的接口显示,但在多线程中直接调用接口控件是错误的。Invoke和BeginInvoke旨在解决此问题,以便您可以在多线程中安全地更新界面显示。正确的方法是将包含更新接口的工作线程中的代码封装到方法中,并通过Invoke或BeginInvoke调用它。两者之间的区别在于,一个线程导致工作线程等待,而另一个线程不等待。

在多线程编程中,我们经常要在工作线程中去更新界面显示,而在多线程中直接调用界面控件的方法是错误的做法,Invoke 和 BeginInvoke 就是为了解决这个问题而出现的,使你在多线程中安全的更新界面显示。

正确的做法是将工作线程中涉及更新界面的代码封装为一个方法,通过 Invoke 或者 BeginInvoke 去调用,两者的区别就是一个导致工作线程等待,而另外一个则不会。

而所谓的“一面响应操作,一面添加节点”永远只能是相对的,使 UI 线程的负担不至于太大而已,因为界面的正确更新始终要通过 UI 线程去做,我们要做的事情是在工作线程中包揽大部分的运算,而将对纯粹的界面更新放到 UI 线程中去做,这样也就达到了减轻 UI 线程负担的目的了。

举个简单例子说明下使用方法,比如你在启动一个线程,在线程的方法中想更新窗体中的一个TextBox.. 

using System.Threading; 

//启动一个线程 
Thread thread=new Thread(new ThreadStart(DoWork)); 
thread.Start(); 

//线程方法 
private void DoWork() 

this.TextBox1.Text="我是一个文本框"; 


如果你像上面操作,在VS2005或2008里是会有异常的... 

正确的做法是用Invoke\BeginInvoke

using System.Threading;
namespace test
{
public partial class Form1 : Form
{
public delegate void MyInvoke(string str1,string str2);
public Form1()
{
InitializeComponent();


}
public void DoWork()
{
MyInvoke mi = new MyInvoke(UpdateForm);
this.BeginInvoke(mi, new Object[] {"我是文本框","haha"});
}
public void UpdateForm(string param1,string parm2)
{
this.textBox1.Text = param1+parm2;
}
private void button1_Click(object sender, EventArgs e)
{
Thread thread = new Thread(new ThreadStart(DoWork));
thread.Start();
}
}
}
注意代理的使用!

免责声明:文章转载自《【转】C#中Invoke的用法》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇数据加密之RijndaelManaged加密STM32学习笔记(1)——搭建库函数工程下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

锁和多线程:3种锁的使用(二)

多线程 synchronized锁 重入锁 读写锁    1.synchronized锁 2.Lock接口 3.ReentrantLock重入锁 4.ReentrantReadWriteLock读写锁   搞明白 线程锁和多线程系列 1.synchronized锁 锁分为 类锁 和 对象锁, 方法锁和私有锁都属于对象锁 类锁:在代码中的...

【学习底层原理系列】Java底层-synchronized锁-2偏向锁篇

上一篇通过构建金字塔结构,来从不同的角度,由浅入深的对synchronized关键字做了介绍, 快速跳转:https://www.cnblogs.com/xyang/p/11631866.html 本文将从底层实现的各个“组件”着手,详细拆解其工作原理。 本文会分为以下2节内容:   第一节:介绍MarkWord和LockRecord两种数据结构,该知识点...

Android Service总结02 service介绍

Android Service总结02 service介绍 版本 版本说明 发布时间 发布人 V1.0 介绍了Service的种类,常用API,生命周期等内容。 2013-03-16 Skywang         概要   若读者之前没接触过service,对下面内容有个大致了解即可。待使用过service之后再来阅读本章内容,会理解...

C#线程学习笔记六:线程同步--信号量和互斥体

    本笔记摘抄自:https://www.cnblogs.com/zhili/archive/2012/07/23/Mutex_And_Semaphore.html,记录一下学习过程以备后续查用。     一、信号量(Semaphore)     信号量(Semaphore)是由内核对象维护的int变量。当信号量为0时,在信号量上等待的线程会堵塞;信号...

C#(委托同步调用、异步调用、异步回调)

本文将主要通过“同步调用”、“异步调用”、“异步回调”三个示例来讲解在用委托执行同一个“加法类”的时候的的区别和利弊。  首先,通过代码定义一个委托和下面三个示例将要调用的方法: public delegate int AddHandler(int a,int b); public class 加法类 { publi...

windows qt 使用c++ posix接口编写多线程程序(真神奇)good

一、多线程是多任务处理的一种特殊形式,多任务处理允许让电脑同时运行两个或两个以上的程序。一般情况下,两种类型的多任务处理:基于进程和基于线程。基于进程的多任务处理是程序的并发执行。基于线程的多任务处理是同一程序的片段的并发执行。多线程程序包含可以同时运行的两个或多个部分。这样的程序中的每个部分称为一个线程,每个线程定义了一个单独的执行路径,C++ 不包含多...