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的委託
固定返回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差不多呢