關于.NET異步調用的初步總結 收藏
異步調用的實質:
異步調用通過委托將所需調用的方法置于一個新線程上運行,從而能夠使一個可能需要較長時間的任務在后臺執(zhí)行而不影響調用方的其他行為。
異步調用的實現(xiàn):
前面已經講道,異步調用通過委托實現(xiàn)。委托支持同步和異步調用。在同步調用中,一個委托的實例可記錄多個目標方法;在異步調用中,一個委托實例中有且只能包含一個目標方法。異步調用使用委托實例的BeginInvoke方法和EndInvoke方法分別開始調用和檢索返回值,這兩個方法在編譯期生成。調用BeginInvoke后委托立即返回;調用EndInvoke時倘若委托方法未執(zhí)行完畢,則阻塞當前線程至調用完畢。
假設有一個委托
public delegate int ASyncHandler(int a, string b, ref string c);
那么,其BeginInvoke與EndInvoke的形式如下:
public IAsyncResult BeginInvoke(int a, string b, ref string c, AsyncCallback callback, object asyncState);
public int EndInvoke(ref string c, IAsyncResult asyncResult);
也就是說,BeginInvoke與EndInvoke的參數(shù)列表與當前委托簽名有關,可以總結為:
public IAsyncResult BeginInvoke(委托所具有的全部參數(shù),AsyncCallback callback,object asyncState);
public 委托返回值 EndInvoke(委托參數(shù)中ref/out部分,IAsyncResult asyncResult);
BeginInvoke返回一個IAsyncResult,其實質是實現(xiàn)IAsyncResult的System.Runtime.Remoting.Messaging.AsyncResult類。該對象相當于一個“憑證”,在調用EndInvoke時用于確認應等待返回的方法(猜測如此)。就像去銀行,存錢時拿到一份存折(憑證),取款時依據(jù)存折(憑證)取款。
EndInvoke檢索委托返回值,并返回標有ref/out的參數(shù)值。
IAsyncResult接口聲明:
view plaincopy to clipboardprint?
public interface IAsyncResult
{
object AsyncState { get;}
WaitHandle AsyncWaitHandle { get;}
bool CompletedSynchronously { get;}
bool IsCompleted { get;}
}
public interface IAsyncResult
{
object AsyncState { get;}
WaitHandle AsyncWaitHandle { get;}
bool CompletedSynchronously { get;}
bool IsCompleted { get;}
}
等待調用結束的四種方法:
1、使用EndInvoke主動等待異步調用結束。這是最簡單的一種方法,適用于非用戶界面程序及一些IO操作,因為在調用EndInvoke之后當前線程被阻塞,除了等待什么都不能做。
2、使用WaitHandle等待異步調用結束。IAsyncResult中有WaitHandle成員,獲取用于等待異步操作完成的WaitHandle,即調用結束信號。使用WaitHandle.WaitOne()可以阻塞當前線程至異步調用完成。這樣做的好處是:在調用WaitOne之后、EndInvoke之前,可以執(zhí)行其他處理。
3、主動輪詢。使用IAsyncResult中有IsCompleted成員檢索當前異步調用情況。該方法適用于用戶界面程序,想象可在一個循環(huán)內做到既等待委托完成,又可以更新用戶界面。
4、使用回調,在異步調用結束時執(zhí)行一個操作。前面的BeginInvoke方法簽名的最后兩個參數(shù)用于回調。需要用到AsyncCallback委托:
public delegate void AsyncCallback(IAsyncResult asyncResult);
回調方法在系統(tǒng)線程池中執(zhí)行。BeginInvoke的最后一個參數(shù)(object asyncState)可以傳遞包含回調方法將要使用的信息的對象。在回調方法中調用EndInvoke可以通過取得System.Runtime.Remoting.Messaging.AsyncResult.AsyncDelegate實現(xiàn)。
個人認為方法1、2相差不算太大。
先寫這么些,以后再補上其他的一些東西。
本站僅提供存儲服務,所有內容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內容,請
點擊舉報。