在 C#1 的時候就包含了APM,在 APM 模型中,異步操作通過 IAsyncResult 接口實現,包括兩個方法 BeginOperationName 和 EndOperationName ,分別表示開始和結束異步操作。
Demo
我們先來看一個同步示例。新建WPF程序,在界面上放一個按鈕。點擊按鈕訪問外網,會有一定時間的阻塞。
當我們點擊按鈕后,因為web請求是同步的,會阻塞UI線程一定時間。從輸出日志上看阻塞時間是 1 秒鐘左右,此時界面呈卡死狀態(tài)。
日志輸出如下:
從運行效果和日志,我們可以看出:
?WebRequest方法調用前后都是在同一個線程上執(zhí)行-UI線程
?WebReqeust方法阻塞了UI線程,導致“假死”現象
WebRequest也提供了異步方法,BeginGetResponse,EndGetResponse。我們修改一下代碼,新增一個按鈕。
日志輸出如下:
從運行效果和日志,我們可以看出:
?異步方法不會阻塞調用方法,調用后立刻返回
?異步方法會在另外一個線程上執(zhí)行
IAsyncResult
BeginOperationName 方法會返回一個實現了 IAsyncResult 接口的對象。該對象存儲了關于異步操作的信息。
轉到定義,我們可以看到接口中都包含哪些內容:
自定義異步方法
實現該接口,定義自己的異步方法。
我們需要新建一個回調函數:
在這之后就可以自定義 APM 異步模型了:
新增一個按鈕,進行調用:
運行效果如下:
日志輸出如下:
結合效果和日志,我們可以得出如下結論:
?自定義的異步方法沒有導致 UI 卡頓
?APM就是把耗時的任務交給新線程去做,然后利用委托進行回調
普通方法的異步
如果是普通方法,也可以通過 委托異步(BeginInvoke, EndInvoke):
總結
1.APM 模型是基于IAsyncResult來實現異步操作的
2.異步操作開始時,把委托傳遞給 IAsyncResult
3.在新線程上執(zhí)行耗時操作
4.耗時操作結束后,修改 IAsyncResult 里的結果數據,并調用 IAsyncResult 里的委托回調
5.在回調里獲取 異步操作 的結果
審核編輯:劉清
-
APM
+關注
關注
1文章
71瀏覽量
13010 -
回調函數
+關注
關注
0文章
87瀏覽量
11563 -
wpf
+關注
關注
1文章
18瀏覽量
8880
發(fā)布評論請先 登錄
相關推薦
評論