转载:C# this.Invoke()的作用与用法 理解三
正确的做法是将工作线程中涉及更新界面的代码封装为一个方法,通过 Invoke 或者 BeginInvoke 去调用,两者的区别就是一个导致工作线程等待,而另外一个则不会。
this.invoke()用法:
(1)
//修改按钮的Enabled属性
private void ModifyButton( bool _b )
{
this.Button1.Enabled = _b;
}
(2)
//声明上面方法的委托
private delegate void ModifyButton_dg( bool _b );
(3)
//调用委托
private void Calldelgate( )
{
/*在Windows窗体应用程序中使用this.Invoke 在WPF应用程序中使用this.Dispatcher.Invoke*/
this.Invoke( new ModifyButton_dg( ModifyButton ) ,new object[]{false});
}
(4)
可以在非UI线程中调用 ,如: 
      //创建线程
Thread _t = new Thread( new ThreadStart( threadmethod )); 
       _t.Start();
//线程入口
private void threadmethod () 
     { 
       //其他代码省略 
      Calldelgate(); 
     }
线程会在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 Form1()
  {
    InitializeComponent();
  }
①//更新窗体中的TextBox1显示内容的方法
public void UpdateForm(string param1,string parm2)
  {
    this.textBox1.Text = param1+parm2;
  }
②//声明委托
③//调用委托
private void Calldelegate()
{
/*在Windows窗体应用程序中使用this.Invoke 在WPF应用程序中使用this.Dispatcher.Invoke*/
this.BeginInvoke(new UpdateForm_dl(UpdateForm), new object[] { "我是文本框", "haha" });
//this.Dispatcher.BeginInvoke(new UpdateForm_dl(UpdateForm), new object[] { "我是文本框", "haha" });
}
④//创建新线程
private void button1_Click(object sender, EventArgs e)
  {
    Thread thread = new Thread(new ThreadStart(DoWork));
    thread.Start();
  }
⑤//新线程入口
public void DoWork()
{
     Calldelegate();
  }
}
}
注意代理的使用!
转载:C# this.Invoke()的作用与用法 理解三的更多相关文章
- C# this.Invoke()的作用与用法
		Invoke()的作用是:在应用程序的主线程上执行指定的委托.一般应用:在辅助线程中修改UI线程( 主线程 )中对象的属性时,调用this.Invoke(); 在多线程编程中,我们经常要在工作线程 ... 
- C# this.Invoke()的作用和用法(摘)
		Invoke()的作用是:在应用程序的主线程上执行指定的委托.一般应用:在辅助线程中修改UI线程( 主线程 )中对象的属性时,调用this.Invoke(); 在多线程编程中,我们经常要在工作线程 ... 
- (转载)MySQL数据类型中DECIMAL的作用和用法
		(转载)http://database.51cto.com/art/201005/201651.htm 在MySQL数据类型中,例如INT,FLOAT,DOUBLE,CHAR,DECIMAL等,它们都 ... 
- Oracle分析函数及常用函数: over(),rank()over()作用及用法--分区(分组)求和& 不连续/连续排名
		(1) 函数: over()的作用及用法: -- 分区(分组)求和. sum() over( partition by column1 order by column2 )主要用来对某个字 ... 
- og标签对SEO的作用及用法
		meta property=og标签对SEO的作用及用法,如果你仔细观察会发现本站点<head>代码中有一段:"property="og:image"这段代码 ... 
- C++ "#"的作用和用法
		本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/48879093 1 #和##的作用和用法 ... 
- serialVersionUID, ObjectInputStream与ObjectOutputStream类,Serializable接口,serialVersionUID的作用和用法
		ObjectInputStream与ObjectOutputStream类所读写的对象必须实现Serializable接口,对象中的transient和static类型成员变量不会被读取和写入 Ser ... 
- Oracle函数over(),rank()over()作用及用法--分区(分组)求和& 不连续/连续排名
		(1) 函数: over()的作用及用法: -- 分区(分组)求和. RANK ( ) OVER ( [query_partition_clause] order_by_clause )D ... 
- Linq中关键字的作用及用法
		Linq中关键字的作用及用法 1.All:确定序列中的所有元素是否都满足条件.如果源序列中的每个元素都通过指定谓词中的测试,或者序列为空,则为 true:否则为 false. Demo: 此示例使用 ... 
随机推荐
- .NET Nancy 详解(一) 初识
			Nancy 是一个轻量级的,简单粗暴的framework用来构建基于HTTP的各种服务,兼容.Net和Mono.Nancy的整套设计理念是基于"super-duper-happy-path& ... 
- 全零网络IP地址0.0.0.0表示意义详谈
			转自:http://liuzhigong.blog.163.com/blog/static/17827237520114207278610/ RFC: 0.0.0.0/8 - Addresses in ... 
- 配置ogg异构mysql-oracle 单向同步
			从mysql到oracle和oracle到mysql差不多.大致步骤如下: 环境是:192.168.0.165 (Mysql ) —> 192.168.0.164 ( Oracle )想将mys ... 
- Centos7-mqtt消息中间件mosquitto的安装和配置
			在以前发布的博客"菜鸟是如何打造智能家居系统的"文章最后我提到了使用MQTT协议作为云平台和设备之间的通信协议以达到消息传递的实时性,手机的消息推送也大多基于这种平台,首先搬来一段 ... 
- CRC校验(转)
			CRC即循环冗余校验码(Cyclic Redundancy Check[1] ):是数据通信领域中最常用的一种差错校验码,其特征是信息字段和校验字段的长度可以任意选定.循环冗余检查(CRC)是一种数据 ... 
- jQuery全局函数
			全局函数是对jQuery对象的扩展,其中扩展方法包括: 一,extend扩展: //调用全局函数$(document).ready(function () { $.myFunction(); $.my ... 
- LoadRunner之安装、破解、汉化教程(一)
			安装前,把所有的杀毒软件和防火墙关闭 安装前,把所有的杀毒软件和防火墙关闭 安装前,把所有的杀毒软件和防火墙关闭........ 注意事项: 安装前,把所有的杀毒软件和防火墙关闭. 若以前安装 ... 
- poj 2115 Looooops
			C Looooops Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 23637 Accepted: 6528 Descr ... 
- ffmpeg处理RTMP流媒体的命令 发送流媒体的命令(UDP,RTP,RTMP)
			将文件当做直播送至live ffmpeg -re -i localFile.mp4 -c copy -f flv rtmp://server/live/streamName re限制输出速率,按照 ... 
- 分享Kali Linux 2016.2第45周镜像
			分享Kali Linux 2016.2第45周镜像Kali Linux官方于11月6日发布Kali Linux 2016.2的第45周的镜像.此次镜像维持了以往11个镜像文件的规模,包括32位.64位 ... 
