C#之Invoke學習


C#中invoke和beginInvoke的使用

1.Control類中的invoke和beginInvoke的定義

  1. invoke的含義是:在擁有此控件的基礎窗口句柄的現呈上同步執行指定的委托(同步)
  2. beginInvoke的含義是:在創建控件的基礎句柄所在線程上異步執行的委托(異步)
  • 句柄(Handle):

​ 句柄是一種抽象的概念,隱藏了內核實現的細節,同時為調用提供了方便,保證了內核的安全性。形象的比喻為“用一個小東西拎起一堆東西的柄”。根據他的概念,我們可以將指針看作一種形式的句柄,但他擁有更獨特的含義:指向內存的某個地址。

​ 在系統中有很多內核對象,這些對象大多很龐大,擁有很多的屬性。當需要傳輸這些屬性時,首先不能直接復制,因為這樣會很慢;其次也不能直接調用這些屬性的首地址,這樣會暴露屬性的位置,進而導致屬性被隨意更改,影響系統的穩定;最后因為內存的地址可能會隨時更改(Windows基於虛擬內存,其內存管理器常常在內存中來回移動對象),直接調用會導致以后使用時找不到地址。

​ 在這個基礎上,采用一種句柄的概念。它是一種對對象的進一步抽象的過程(理解面向對象的概念),它會在進程的地址空間中設置一張表格,里面保存着某個對象的編號和這個編號對應的地址,通過這個地址去引用這個對象。這個編號就是句柄。句柄的作用就是將對象的真實地址隱藏起來,同時提供一種對該對象的映射地址方便調用。這樣既能保證對象的安全性,也能保證調用的便利。

2.invoke的用法

​ 上面的解釋通俗的來說就是在一個應用程序的主線程上調用執行指定的委托。主要目的是讓工作的線程完成絕大部分的運算工作,將純粹的界面更新放到UI線程中去完成,達到減輕UI線程負擔的目的(避免UI無響應)。

//this.invoke的使用方法
//第一步:定義修改UI的方法
private void ModifyButton( bool _b )
{
   this.Button1.Enabled = _b;
}
//第二步:聲明第一步方法的委托
private delegate void ModifyButton_dg( bool _b );
//第三步:調用委托
private void Calldelgate( )
{
   /*在Windows窗體應用程序中使用this.Invoke 在WPF應用程序中使用this.Dispatcher.Invoke*/
   this.Invoke( new ModifyButton_dg( ModifyButton ) ,new object[]{false});
}
//第四步:在非UI的線程中調用
  //創建線程 
      Thread _t = new Thread( new ThreadStart( threadmethod )); 
       _t.Start(); 
    //線程入口  
    private void threadmethod () 
     { 
      Calldelgate(); 
     } 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM