1. 程式人生 > >C# 使用委託實現非同步程式設計的四種方式

C# 使用委託實現非同步程式設計的四種方式

一、關於委託

1、委託概念:委託是一個類,它定義了方法的型別,使得可以將方法當作另一個方法的引數來進行傳遞

     個人角色這個概念有些晦澀難懂,大家可以把委託當成一個方法的指標就好了,可以指向一個方法。或者通過(+=)的方式指向多個。

2、四種宣告方式

1)直接用delegate

   public delegate int myDelegate(int x, int y);表示有兩個引數,並返回int型。

   int 型別為 這個myDelegate委託的預設返回值型別。括號內的引數為,委託中的引數。可以理解為,這個委託指向的需要執行的方法的引數。

   比如像這個方法: public int sum(int a,int b)

         {

          int c=0;

          c=a+b;

         return c;

         }

2)Action 

   這個無返回值的泛型委託,但是可以有引數(最多16個引數)

   Action<int,string,bool> 表示有三個傳入引數,型別分別為int,string,bool

3)Func

  有返回值的泛型委託

  Func<T1,T2,,T3,int> 表示傳入引數為T1,T2,,T3(泛型)返回值為int的委託

4)predicate

  固定返回bool型的泛型委託,且只有一個引數

   predicate<int> 表示傳入引數為int 返回bool的委託

二、介紹BeginInvoke,EndInvoke

    1、建立一個委託物件,通過IAsyncResultBeginInvoke(string name,AsyncCallback callback,object state)非同步呼叫委託方法,BeginInvoke方法除最後的兩個引數外,其他引數都是與方法引數相對應的。

    2、利用EndInvoke(IAsyncResult--上一步BeginInvoke返回的物件)方法就可以結束非同步操作,獲取委託的執行結果。

三、實際非同步執行中的使用方法

   主要使用BeginInvoke與EndInvoke,關於返回值使用IAsyncResult物件獲取

1、delegate 

  首先要定義一個委託,名稱為CouDelegate

返回值為bool,入參為 int 型別

1)public delegate bool CouDelegate(int a);

2)主函式中如下

CouDelegate cpd = new CouDelegate(你要執行的方法);

IAsyncResult result = cpd.BeginInvoke(a, null, null);

獲取返回值這麼寫:

bool flag= cpd.EndInvoke(result);//如果主函式中呼叫EndInvoke,那麼啟用的這個執行緒會一直執行完畢後,獲取返回值,再繼續往下走(與序列一樣,未起到非同步作用)

2、Action

   Action a=myThreadMethod;//通過委託開啟一個執行緒,委託指向myThreadMethod方法

   a.BeginInvoke(這裡寫myThreadMethod的引數);

3、Func

  Func<int, string,int> f = MyThread;   //入參為int,string,返回值為int(第三個引數為返回值型別)
  IAsyncResult ar=f.BeginInvoke(3,"str引數",null,null);//IAsyncResult可以獲得當前執行緒的狀態
  while (ar.IsCompleted == false)  //執行緒還沒有結束(判斷執行緒是否結束)
    {
      Console.Write(".");
      Thread.Sleep(100);     //休眠100ms(毫秒)即0.1秒;
      }
    int result = f.EndInvoke(ar);

4、predicate

  用法與Func差不多呢