C# this.Invoke()的作用和用法(摘)

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

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

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

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

例如:

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

 1 using System.Threading;
 2 namespace test
 3 {
 4   public partial class Form1 : Form
 5   {
 6 
 7  
 8 
 9   public Form1()
10   {
11     InitializeComponent();
12   }
13   
14 
15  
16 
17//更新窗体中的TextBox1显示内容的方法
18 
19   public void UpdateForm(string param1,string parm2)
20   {
21     this.textBox1.Text = param1+parm2;
22   }
23 
24  
25 
26//声明委托
27 
28  
29 
30  
31 
32  
33 
34   public delegate void  UpdateForm_dl(string str1, string str2);
35   
36 
37//调用委托
38 
39   private void Calldelegate()
40 
41   {
42 
43     /*在Windows窗体应用程序中使用this.Invoke    在WPF应用程序中使用this.Dispatcher.Invoke*/
44 
45     this.BeginInvoke(new UpdateForm_dl(UpdateForm), new object[] { "我是文本框", "haha" });
46 
47     //this.Dispatcher.BeginInvoke(new UpdateForm_dl(UpdateForm), new object[] { "我是文本框", "haha" });
48 
49   }
50 
51   
52//创建新线程
53 
54   private void button1_Click(object sender, EventArgs e)
55   {
56     Thread thread = new Thread(new ThreadStart(DoWork));
57     thread.Start();
58   }
59 
60  
61 
62//新线程入口
63 
64   public void DoWork()
65 
66   {
67      Calldelegate();
68   }
69 
70 
71   }
72 }
View Code

注意代理的使用!

原文地址:https://www.cnblogs.com/dabexiong/p/5476558.html