在 C#1 的時候就包含了APM,在 APM 模型中,異步操作通過 IAsyncResult 接口實現,包括兩個方法 BeginOperationName 和 EndOperationName ,分別表示開始和結束異步操作。
Demo
我們先來看一個同步示例。新建WPF程序,在界面上放一個按鈕。點擊按鈕訪問外網,會有一定時間的阻塞。
當我們點擊按鈕后,因為web請求是同步的,會阻塞UI線程一定時間。從輸出日志上看阻塞時間是 1 秒鐘左右,此時界面呈卡死狀態。
日志輸出如下:
從運行效果和日志,我們可以看出:
?WebRequest方法調用前后都是在同一個線程上執行-UI線程
?WebReqeust方法阻塞了UI線程,導致“假死”現象
WebRequest也提供了異步方法,BeginGetResponse,EndGetResponse。我們修改一下代碼,新增一個按鈕。
日志輸出如下:
從運行效果和日志,我們可以看出:
?異步方法不會阻塞調用方法,調用后立刻返回
?異步方法會在另外一個線程上執行
IAsyncResult
BeginOperationName 方法會返回一個實現了 IAsyncResult 接口的對象。該對象存儲了關于異步操作的信息。
轉到定義,我們可以看到接口中都包含哪些內容:
自定義異步方法
實現該接口,定義自己的異步方法。
我們需要新建一個回調函數:
在這之后就可以自定義 APM 異步模型了:
新增一個按鈕,進行調用:
運行效果如下:
日志輸出如下:
結合效果和日志,我們可以得出如下結論:
?自定義的異步方法沒有導致 UI 卡頓
?APM就是把耗時的任務交給新線程去做,然后利用委托進行回調
普通方法的異步
如果是普通方法,也可以通過 委托異步(BeginInvoke, EndInvoke):
總結
1.APM 模型是基于IAsyncResult來實現異步操作的
2.異步操作開始時,把委托傳遞給 IAsyncResult
3.在新線程上執行耗時操作
4.耗時操作結束后,修改 IAsyncResult 里的結果數據,并調用 IAsyncResult 里的委托回調
5.在回調里獲取 異步操作 的結果
審核編輯:劉清
-
APM
+關注
關注
1文章
71瀏覽量
13046 -
回調函數
+關注
關注
0文章
87瀏覽量
11623 -
wpf
+關注
關注
1文章
19瀏覽量
8893
發布評論請先 登錄
相關推薦
【我是電子發燒友】低功耗設計的最佳編程模型:異步編程
阿里云 APM 解決方案地圖
如何對三相異步電機SPWM變頻調速系統模型進行Simulink仿真
為什么說回調函數可以實現異步操作
異步電動機動態數學模型
基于MATLAB及SIMULINK的異步電動機仿真模型及起動過程的仿真
Modelica標準庫里的異步電機模型
異步事件驅動模型在嵌入式系統中的應用
介紹一種基于任務的異步模式TAP
異步電機控制筆記
![<b class='flag-5'>異步</b>電機控制筆記](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評論