在 C#1 的時候就包含了APM,在 APM 模型中,異步操作通過 IAsyncResult 接口實現(xiàn),包括兩個方法 BeginOperationName 和 EndOperationName ,分別表示開始和結(jié)束異步操作。
Demo
我們先來看一個同步示例。新建WPF程序,在界面上放一個按鈕。點擊按鈕訪問外網(wǎng),會有一定時間的阻塞。
當我們點擊按鈕后,因為web請求是同步的,會阻塞UI線程一定時間。從輸出日志上看阻塞時間是 1 秒鐘左右,此時界面呈卡死狀態(tài)。
日志輸出如下:
從運行效果和日志,我們可以看出:
?WebRequest方法調(diào)用前后都是在同一個線程上執(zhí)行-UI線程
?WebReqeust方法阻塞了UI線程,導致“假死”現(xiàn)象
WebRequest也提供了異步方法,BeginGetResponse,EndGetResponse。我們修改一下代碼,新增一個按鈕。
日志輸出如下:
從運行效果和日志,我們可以看出:
?異步方法不會阻塞調(diào)用方法,調(diào)用后立刻返回
?異步方法會在另外一個線程上執(zhí)行
IAsyncResult
BeginOperationName 方法會返回一個實現(xiàn)了 IAsyncResult 接口的對象。該對象存儲了關(guān)于異步操作的信息。
轉(zhuǎn)到定義,我們可以看到接口中都包含哪些內(nèi)容:
自定義異步方法
實現(xiàn)該接口,定義自己的異步方法。
我們需要新建一個回調(diào)函數(shù):
在這之后就可以自定義 APM 異步模型了:
新增一個按鈕,進行調(diào)用:
運行效果如下:
日志輸出如下:
結(jié)合效果和日志,我們可以得出如下結(jié)論:
?自定義的異步方法沒有導致 UI 卡頓
?APM就是把耗時的任務(wù)交給新線程去做,然后利用委托進行回調(diào)
普通方法的異步
如果是普通方法,也可以通過 委托異步(BeginInvoke, EndInvoke):
總結(jié)
1.APM 模型是基于IAsyncResult來實現(xiàn)異步操作的
2.異步操作開始時,把委托傳遞給 IAsyncResult
3.在新線程上執(zhí)行耗時操作
4.耗時操作結(jié)束后,修改 IAsyncResult 里的結(jié)果數(shù)據(jù),并調(diào)用 IAsyncResult 里的委托回調(diào)
5.在回調(diào)里獲取 異步操作 的結(jié)果
審核編輯:劉清
-
APM
+關(guān)注
關(guān)注
1文章
72瀏覽量
13661 -
回調(diào)函數(shù)
+關(guān)注
關(guān)注
0文章
93瀏覽量
12053 -
wpf
+關(guān)注
關(guān)注
1文章
19瀏覽量
9058
發(fā)布評論請先 登錄
【我是電子發(fā)燒友】低功耗設(shè)計的最佳編程模型:異步編程
阿里云 APM 解決方案地圖
三相異步電機靜止狀態(tài)下參數(shù)辨識MATLAB仿真模型
為什么說回調(diào)函數(shù)可以實現(xiàn)異步操作
異步電動機動態(tài)數(shù)學模型
基于MATLAB及SIMULINK的異步電動機仿真模型及起動過程的仿真
Modelica標準庫里的異步電機模型
異步事件驅(qū)動模型在嵌入式系統(tǒng)中的應(yīng)用
CUDA簡介: CUDA編程模型概述

介紹一種基于任務(wù)的異步模式TAP
基于DQ0模型的三相異步電機自制仿真模型教程

異步電機控制筆記

評論