讓我們來看看同步異步的區別:
同步方法調用在程序繼續執行之前需要等待同步方法執行完畢返回結果
異步方法則在被調用之後立即返回以便程序在被調用方法完成其任務的同時執行其它操作
.NET框架基類庫中有好幾種類都可以提供同步和異步的方法調用。
因爲同步方法調用會導致程序流程中途等待,所以採用同步方法的情況下往往會導致程序執行的延遲
相比來說,在某些條件下選擇異步方法調用就可能更好一些
例如,有的時候程序需要給多個Web服務發出請求,還有遠程處理信道(HTTP、TCP)和代理,這時就最好採用異步方法
.NET Framework允許異步調用任何方法,定義與需要調用的方法具有相同簽名的委託
CLR將自動爲該委託定義添加適當簽名的BeginInvoke虛方法和EndInvoke虛方法和Invoke方法。
關於委託的這3個方法的詳細說明可以參考這文章
http://www.cnblogs.com/aierong/archive/2005/05/25/162181.html
我們先來了解這2個方法和一個委託和一個接口:
(1)
BeginInvoke方法用於啓動異步調用
它與您需要異步執行的方法具有相同的參數,只不過還有兩個額外的參數,將 AsyncCallback 和 AsyncState(可通過 IAsyncResult 接口的
AsyncState 屬性獲得)作爲最後兩個參數,如沒有可以爲空.
BeginInvoke立即返回,不等待異步調用完成。
BeginInvoke返回IasyncResult,可用於監視調用進度。
結果對象IAsyncResult是從開始操作返回的,並且可用於獲取有關異步開始操作是否已完成的狀態。
結果對象被傳遞到結束操作,該操作返回調用的最終返回值。
在開始操作中可以提供可選的回調。如果提供回調,在調用結束後,將調用該回調;並且回調中的代碼可以調用結束操作。
(2)
EndInvoke方法用於檢索異步調用結果。
在調用BeginInvoke後可隨時調用EndInvoke方法,注意:始終在異步調用完成後調用EndInvoke.
如果異步調用未完成,EndInvoke將一直阻塞到異步調用完成。
EndInvoke的參數包括需要異步執行的方法的out和ref參數以及由BeginInvoke返回的IAsyncResult。
要注意的是,始終在異步調用完成後調用EndInvoke
(3)
AsyncCallback委託用於指定在開始操作完成後應被調用的方法
AsyncCallback委託被作爲開始操作上的第二個到最後一個參數傳遞
代碼原型如下:
[Serializable]
public delegate void AsyncCallback(IAsyncResult ar);
(4)
IAsyncResult接口
它表示異步操作的狀態.
該接口定義了4個公用屬性
以上轉自http://www.cnblogs.com/panjun-Donet/archive/2008/09/04/1284700.html
現在有這樣一個需求:在一個FORM中,裏邊有個按鈕的單擊事件,當我們單擊按鈕時候會調用服務器的一個方法。 要求是:當單擊時候調用方法的同時會彈出一個GIF圖片窗體,表示程序當前正在運行,當調用完成後,關閉該GIF圖片窗體。
步驟1.新建一個窗體,上邊放一個PICBOX控件,PICBOX控件上邊放張GIF圖片,窗體設置成沒有標題欄,同時拖入一個TIMER控件。 在該窗體的代碼窗口中添加如下代碼
在窗體的LOAD事件中
在TIMER的TICK時間中插入
2.回到我們主窗體的BUTTON_CLICK事件。
我們在該窗體先定義一個委託
public delegate void DeleteAA();
添加一個方法用來調用服務器方法
然後看我們BUTTON_CLICK事件
大概效果就出來了
由於剛剛開始接觸,所以還有些東西很難理解..