在學習非同步前有必要討論“我們為什麼要瞭解非同步”,也就是非同步對我們編寫程式有什麼好處。現說說同步把,所謂同步就是按照程式編碼的順序執行,非同步說的粗糙點就是不按照編碼的順序執行,我們什麼時候需要進行非同步編程呢--------如果我們遇到某個任務特別費時,由於下面執行的任務和上個任務無關,我們可以用非同步執行(當然也可以用多線程);知道什麼時候使用非同步,那我們接下來開始學習非同步編程吧。
一,非同步編程的步驟
1,建立與被呼叫者法相同簽名的委託
假設被調用的方法為public void TestMethod(string p)
Public delegate void AsyncDelegate(string p);
2,把被調用的方法註冊到委託執行個體
AsyncDelegate ad=new AsyncDelegate(TestMethod);
3,以begininvoke開始調用非同步方法呼叫
IAsyncResult ar =Ad.BeginInvoke(string p,null,null)
4,繼續做一些不需要非同步呼叫結果的操作
//做一些其它操作
5,在需要非同步呼叫方法結果的時候,察看非同步呼叫方法執行的結果,並同步等待非同步呼叫完成。
while(ar.IsCompleted == false)
{
Thread.Sleep(10);
}
Ad.EndBeginInvoke();
//繼續操作
二,執行個體(附在後面)
三,在非同步呼叫中使用IAsyncResult(表示非同步作業的狀態)和AsyncCallback(非同步呼叫完成時執行回調方法)
1,建立與被呼叫者法相同簽名的委託
假設被調用的方法為public void TestMethod(string p)
Public delegate void AsyncDelegate(string p);
2,把被調用的方法註冊到委託執行個體
AsyncDelegate ad=new AsyncDelegate(TestMethod);
3,定義非同步呼叫完成時執行的回調方法
Public void CallbackMethod(IAsyncResult ar)
4,以begininvoke開始調用非同步方法呼叫
IAsyncResult ar =Ad.BeginInvoke(string p,new AsyncCallback(CallbackMethod),null)
5,繼續做一些不需要非同步呼叫結果的操作
//做一些其它操作
四,執行個體(附在後面)
五,總結“非同步方法呼叫簽名”
方法簽名是參數類型在一個方法中的順序。BeginInvoke 非同步方法呼叫簽名的規則是:
- 包括所有 IN 參數。
- 包括所有 OUT 參數。
- 包括所有 IN/OUT 參數。
- 包括所有 ByRef 參數。
- 將 AsyncCallback 和 AsyncState(可通過 IAsyncResult 介面的 AsyncState 屬性獲得)作為最後兩個參數。
- 返回 IAsyncResult。
EndInvoke 非同步方法呼叫簽名的規則是:
- 包括所有 IN/OUT 參數。
- 包括所有 OUT 參數。
- 包括所有 ByRef 參數。
- 將 IAsyncResult 作為最後一個參數。
- 從原始方法簽名返回原始傳回型別。
結果對象 (IAsyncResult) 是從開始操作返回的,並且可用於擷取有關非同步開始操作是否已完成的狀態。結果對象被傳遞到結束操作,該操作返回調用的最終傳回值。在開始操作中可以提供可選的回調。如果提供回調,在調用結束後,將調用該回調;並且回調中的代碼可以調用結束操作。
原始碼:/Files/chinhr/code.rar