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