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