在 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請(qǐng)求是同步的,會(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 接口的對(duì)象。該對(duì)象存儲(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文章
74瀏覽量
13850 -
回調(diào)函數(shù)
+關(guān)注
關(guān)注
0文章
95瀏覽量
12177 -
wpf
+關(guān)注
關(guān)注
1文章
19瀏覽量
9118
發(fā)布評(píng)論請(qǐng)先 登錄
【我是電子發(fā)燒友】低功耗設(shè)計(jì)的最佳編程模型:異步編程
阿里云 APM 解決方案地圖
三相異步電機(jī)靜止?fàn)顟B(tài)下參數(shù)辨識(shí)MATLAB仿真模型
為什么說回調(diào)函數(shù)可以實(shí)現(xiàn)異步操作
異步電動(dòng)機(jī)動(dòng)態(tài)數(shù)學(xué)模型
基于MATLAB及SIMULINK的異步電動(dòng)機(jī)仿真模型及起動(dòng)過程的仿真
Modelica標(biāo)準(zhǔn)庫里的異步電機(jī)模型
異步事件驅(qū)動(dòng)模型在嵌入式系統(tǒng)中的應(yīng)用
CUDA簡(jiǎn)介: CUDA編程模型概述
介紹一種基于任務(wù)的異步模式TAP
基于DQ0模型的三相異步電機(jī)自制仿真模型教程
異步電機(jī)控制筆記
基于IAsyncResult的APM模型實(shí)現(xiàn)異步操作
評(píng)論