0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀(guān)看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于IAsyncResult的APM模型實(shí)現(xiàn)異步操作

冬至配餃子 ? 來(lái)源:希夏普 ? 作者:jqwang ? 2022-08-19 11:16 ? 次閱讀

C#1 的時(shí)候就包含了APM,在 APM 模型中,異步操作通過(guò) IAsyncResult 接口實(shí)現(xiàn),包括兩個(gè)方法 BeginOperationName 和 EndOperationName ,分別表示開(kāi)始和結(jié)束異步操作。

Demo

我們先來(lái)看一個(gè)同步示例。新建WPF程序,在界面上放一個(gè)按鈕。點(diǎn)擊按鈕訪(fǎng)問(wèn)外網(wǎng),會(huì)有一定時(shí)間的阻塞。
pYYBAGL-_qeAPVyfAAD1IE_OjOc100.png

當(dāng)我們點(diǎn)擊按鈕后,因?yàn)閣eb請(qǐng)求是同步的,會(huì)阻塞UI線(xiàn)程一定時(shí)間。從輸出日志上看阻塞時(shí)間是 1 秒鐘左右,此時(shí)界面呈卡死狀態(tài)。

poYBAGL-_rmAQnXzAAFr-wN5eyY784.png

日志輸出如下:

poYBAGL-_smAYNE6AAArb7NO7WY149.png

從運(yùn)行效果和日志,我們可以看出:

?WebRequest方法調(diào)用前后都是在同一個(gè)線(xiàn)程上執(zhí)行-UI線(xiàn)程

?WebReqeust方法阻塞了UI線(xiàn)程,導(dǎo)致“假死”現(xiàn)象

WebRequest也提供了異步方法,BeginGetResponse,EndGetResponse。我們修改一下代碼,新增一個(gè)按鈕。

poYBAGL-_ymAW9W8AAF1Q51U0Sw475.png

poYBAGL-_y6AOTWZAAA5LQYoYik427.png

poYBAGL-_zOAHVEEAAETOUoVOZI570.pngpYYBAGL-_zqAS42KAAEbyMxfzP8322.png
pYYBAGL-_0yAZdX5AAG4yny4GuM913.png

日志輸出如下:

pYYBAGL-_12AM_2aAAA7KWQJx-M423.png

從運(yùn)行效果和日志,我們可以看出:

?異步方法不會(huì)阻塞調(diào)用方法,調(diào)用后立刻返回

?異步方法會(huì)在另外一個(gè)線(xiàn)程上執(zhí)行

IAsyncResult

BeginOperationName 方法會(huì)返回一個(gè)實(shí)現(xiàn)了 IAsyncResult 接口的對(duì)象。該對(duì)象存儲(chǔ)了關(guān)于異步操作的信息。

poYBAGL-_3SAWdDXAACM2tYq1QA599.png

轉(zhuǎn)到定義,我們可以看到接口中都包含哪些內(nèi)容:

pYYBAGL-_4eASnqaAABRku0vIWA696.png

自定義異步方法

實(shí)現(xiàn)該接口,定義自己的異步方法。

poYBAGL-_5mAGXFKAADVN429fBk232.png

我們需要新建一個(gè)回調(diào)函數(shù):

pYYBAGL-_6qANA47AAClHdlc9o4419.png

在這之后就可以自定義 APM 異步模型了:

poYBAGL-_8aAaAa5AAFNs87dVXU166.png

新增一個(gè)按鈕,進(jìn)行調(diào)用:

pYYBAGL-_92ARluPAAD6rQPJe84712.png

運(yùn)行效果如下:

pYYBAGL-__CAGHZJAAFxAYyEPY4508.png

日志輸出如下:

poYBAGL_AAOAamJOAAA1XXh4sns725.png

結(jié)合效果和日志,我們可以得出如下結(jié)論:

?自定義的異步方法沒(méi)有導(dǎo)致 UI 卡頓

?APM就是把耗時(shí)的任務(wù)交給新線(xiàn)程去做,然后利用委托進(jìn)行回調(diào)

普通方法的異步

如果是普通方法,也可以通過(guò) 委托異步(BeginInvoke, EndInvoke):

pYYBAGL_ABmAHW8uAABIrRtICAY507.png

總結(jié)

1.APM 模型是基于IAsyncResult來(lái)實(shí)現(xiàn)異步操作的

2.異步操作開(kāi)始時(shí),把委托傳遞給 IAsyncResult

3.在新線(xiàn)程上執(zhí)行耗時(shí)操作

4.耗時(shí)操作結(jié)束后,修改 IAsyncResult 里的結(jié)果數(shù)據(jù),并調(diào)用 IAsyncResult 里的委托回調(diào)

5.在回調(diào)里獲取 異步操作 的結(jié)果



審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀(guān)點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • APM
    APM
    +關(guān)注

    關(guān)注

    1

    文章

    70

    瀏覽量

    12937
  • 回調(diào)函數(shù)
    +關(guān)注

    關(guān)注

    0

    文章

    87

    瀏覽量

    11508
  • wpf
    wpf
    +關(guān)注

    關(guān)注

    1

    文章

    18

    瀏覽量

    8849
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    異步電機(jī)仿真模型

    這里有一個(gè)完整的異步電機(jī)直接轉(zhuǎn)矩控制的仿真模型,大家可以交流下!
    發(fā)表于 10-09 14:04

    【我是電子發(fā)燒友】低功耗設(shè)計(jì)的最佳編程模型異步編程

    異步編程可以編寫(xiě)出速度快、資源省的高效程序,可以在單線(xiàn)程環(huán)境下實(shí)現(xiàn)高并發(fā),可以在沒(méi)有操作系統(tǒng)的情況下實(shí)現(xiàn)TCP/IP等協(xié)議棧。又快又省可以將功耗控制在最低水平,因此
    發(fā)表于 04-29 20:30

    阿里云 APM 解決方案地圖

    用程序進(jìn)行接口性能,鏈路追蹤,以及錯(cuò)誤診斷三個(gè)方面監(jiān)控。其中,應(yīng)用監(jiān)控通過(guò)探針,亦可捕獲容器和操作系統(tǒng)的性能和狀態(tài),因此也可用于容器和操作系統(tǒng)的性能監(jiān)控。操作系統(tǒng):主要由云監(jiān)控的主機(jī)監(jiān)控來(lái)實(shí)現(xiàn)
    發(fā)表于 07-05 16:54

    三相異步電機(jī)靜止?fàn)顟B(tài)下參數(shù)辨識(shí)MATLAB仿真模型

    三相異步電機(jī)靜止?fàn)顟B(tài)下參數(shù)辨識(shí)MATLAB仿真模型實(shí)現(xiàn)對(duì)定子電阻、轉(zhuǎn)子電阻、互感和漏感的辨識(shí)。
    發(fā)表于 08-15 13:16

    如何對(duì)三相異步電機(jī)SPWM變頻調(diào)速系統(tǒng)模型進(jìn)行Simulink仿真

    三相異步電機(jī)SPWM的基本原理是什么?怎樣去搭建一種三相異步電機(jī)SPWM變頻調(diào)速系統(tǒng)模型?如何對(duì)三相異步電機(jī)SPWM變頻調(diào)速系統(tǒng)模型進(jìn)行Si
    發(fā)表于 08-02 06:12

    異步電動(dòng)機(jī)動(dòng)態(tài)數(shù)學(xué)模型

    ...PAGE...目錄 TOC \o "1-3" \h \z \u1 引言 12 異步電動(dòng)機(jī)動(dòng)態(tài)數(shù)學(xué)模型 22.1異步電動(dòng)機(jī)動(dòng)態(tài)數(shù)學(xué)模型的性質(zhì) 22.2三相
    發(fā)表于 09-03 06:54

    基于MATLAB及SIMULINK的異步電動(dòng)機(jī)仿真模型及起動(dòng)過(guò)程的仿真

    基于MA TL ABΠSIMUL IN K的異步電動(dòng)機(jī)仿真模型及起動(dòng)過(guò)程的仿真鄧建國(guó)①(湖南大學(xué)電氣與信息工程學(xué)院,湖南長(zhǎng)沙410082)摘 要:利用MA TLAB軟件中的動(dòng)態(tài)仿真工具SIMUL
    發(fā)表于 09-06 06:11

    Modelica標(biāo)準(zhǔn)庫(kù)里的異步電機(jī)模型

    Modelica標(biāo)準(zhǔn)庫(kù)里的異步電機(jī)模型過(guò)于復(fù)雜,為了便于學(xué)習(xí),我用最基本的異步電機(jī)方程寫(xiě)了一個(gè)Modelica模型,公式參照陳伯時(shí)的《電力拖動(dòng)自動(dòng)控制系統(tǒng)--運(yùn)動(dòng)控制系統(tǒng)》第3版的19
    發(fā)表于 09-06 07:46

    異步事件驅(qū)動(dòng)模型在嵌入式系統(tǒng)中的應(yīng)用

    異步事件驅(qū)動(dòng)并發(fā)模型運(yùn)用于嵌入式Linux,可使程序占用系統(tǒng)資源少、運(yùn)行效率高。本文介紹了以libcssl函數(shù)庫(kù)中提供的串行接口函數(shù),在嵌入式 Linux的串行通信中實(shí)現(xiàn)異步事件驅(qū)
    發(fā)表于 06-09 09:07 ?13次下載

    APM飛行操作

    有關(guān)APM飛控的飛行操作的完整教程,初學(xué)者必讀的教材。
    發(fā)表于 02-23 10:52 ?0次下載

    CUDA簡(jiǎn)介: CUDA編程模型概述

    在 CUDA 編程模型中,線(xiàn)程是進(jìn)行計(jì)算或內(nèi)存操作的最低抽象級(jí)別。 從基于 NVIDIA Ampere GPU 架構(gòu)的設(shè)備開(kāi)始,CUDA 編程模型通過(guò)異步編程
    的頭像 發(fā)表于 04-20 17:16 ?2848次閱讀
    CUDA簡(jiǎn)介: CUDA編程<b class='flag-5'>模型</b>概述

    異步、同步電機(jī)的模型、矢量控制圖

    異步、同步電機(jī)的模型、矢量控制
    發(fā)表于 07-04 14:56 ?3次下載

    介紹一種基于任務(wù)的異步模式TAP

    TAP是基于任務(wù)的異步模式,在 .NET Framework 4 中引入。TAP是 APM 和 EAP,是推薦的模式模式。
    的頭像 發(fā)表于 08-19 11:45 ?2479次閱讀

    基于DQ0模型的三相異步電機(jī)自制仿真模型教程

    【SIMUlink】基于DQ0模型的三相異步電機(jī)自制仿真模型 其實(shí),打開(kāi)simscape自帶的異步電機(jī)模型,里面也是基于DQ0的電機(jī)的
    發(fā)表于 03-29 11:48 ?1次下載
    基于DQ0<b class='flag-5'>模型</b>的三相<b class='flag-5'>異步</b>電機(jī)自制仿真<b class='flag-5'>模型</b>教程

    異步電機(jī)控制筆記

    異步電機(jī)控制筆記 本筆記討論異步電機(jī)的控制算法。先對(duì)異步電機(jī)在A(yíng)BC坐標(biāo)系以及DQ0坐標(biāo)系下的電壓方程與磁鏈方程進(jìn)行推導(dǎo),然后對(duì)常用的旋轉(zhuǎn)坐標(biāo)系下的異步電機(jī)
    發(fā)表于 03-29 11:40 ?2次下載
    <b class='flag-5'>異步</b>電機(jī)控制筆記