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

{spa

   this.Button1.Enabled = _b;線程

}代理

(2)orm

//聲明上面方法的委託對象

private delegate void ModifyButton_dg( bool _b );blog

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

  }}注意代理的使用!

相關文章
相關標籤/搜索