C# this.Invoke()的作用与用法

Invoke()的作用是:在应用程序的主线程上执行指定的委托。一般应用:在辅助线程中修改UI线程( 主线程 )中对象的属性时,调用this.Invoke();

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

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

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

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;
  }

②//声明委托

  public delegate void  UpdateForm_dl(string str1, string str2);

③//调用委托

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();
  }

}
}
注意代理的使用!

(0)

相关推荐

  • c#多线程通信之委托事件

    在研究c# 线程之间通信时,发现传统的方法大概有三种: 全局变量,由于同一进程下的多个进程之间共享数据空间,所以使用全局变量是最简单的方法,但要记住使用volatile进行限制. 线程之间发送消息(这 ...

  • 复硝酚钠的作用及用法用量 使用方法 使用注意事项

    复硝酚钠是很多农友都知道的一种植物生长调节剂,很多农友发来疑问,问复硝酚钠的作用及用法用量什么样呢?具体的使用方法是什么呢?在使用时有什么注意事项呢?小编为大家整理了一篇关于复硝酚钠的相关信息,下面一 ...

  • “温胃散寒、降逆止呕第一药”:吴茱萸作用及用法

    吴茱萸味辛苦,性热,有温胃散寒.疏肝燥脾.暖肾治疝的作用. 常用于治疗: 一.胃痛吐酸胃寒疼痛,吞酸,呕吐,胸满等症,可用吴茱萸温胃散寒.降逆止呕.常配合生姜.半夏.高良姜.藿香.砂仁等同用.如肝气郁 ...

  • 带你一起了解功能强大的麦芽酚,作用和用法你了解吗?进来看看

    带你一起了解功能强大的麦芽酚,作用和用法你了解吗?进来看看

  • ​冬青油的作用及用法

    ​冬青油的作用及用法 摘要冬青油是一种从常绿植物鹿蹄草叶子萃取而得的精油.晚春时,这种植物会长出白色小花,并在夏季变成红色浆果,并可以持续到下一个春天来临.其压碎的叶子有令人愉快的草药味.土生土长的美 ...

  • 一味中药可化72种结石 揭秘化石草的作用和用法

    一味中药可化72种结石 揭秘化石草的作用和用法 科普本草 今天 科普本草 中药材知识科普,以及中药材行业发展,中药材种植技术宣传,中药材加工技术交流等等:欢迎中药材种植,加工等行业人士关注交流. 10 ...

  • 中药斑蝥的抗癌作用和用法 | 周志远

    斑蝥的抗癌作用 将斑蝥用于治疗癌症,自古有之.现代医学经过动物实验和临床实践也证实了斑蝥的抗癌作用,并 从斑蝥中提炼出斑蝥素等有效成分,制成成药,用于临床抗癌.但是斑蝥的毒性极大,在<神农本草经 ...

  • 接骨木的功效与作用,用法用量及附方

    接骨木又叫公道老,扦扦活.马尿骚.大接骨丹等,是一种分布在我国黑龙江.吉林.辽宁.河北.山西等地的小乔木植物,一般可以长至5-6米.而接骨木主要的用途是医药用途.并且不同的部位具有不同的药用价值,下面 ...

  • 风水罗盘,“地盘、人盘、天盘”的作用与用法风水解说 相地指南 2021/3/30

    风水罗盘,"地盘.人盘.天盘"的作用与用法 1.地盘(正针,正五行) 地盘是按后天八 卦方位分成八方,每方三格,共计 24 格,称为"24山",每山各占 15 ...

  • 麦冬的简介、功效与作用及用法用量

        2015-05-09 15:27  中华康网原创 麦冬,多年生草本,高12-40cm,须根中部或先端常膨大形成肉质小块根那么麦冬的功效与作用是什么呢?麦冬的用法用量和禁忌注意有哪些?下面就跟随 ...