C#使用異步方式調用同步方法的實現方法

使用異步方式調用同步方法,在此我們使用異步編程模型(APM)實現
1、定義異步委托和測試方法

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;namespace ApmAsyncApp
{public delegate string TestMethodAsyncCaller(int callDuration, out int threadId);/// <summary>internal class AsyncDemo{/// 執行異步調用的方法/// </summary>/// <param name="callDuration"></param>/// <param name="threadId"></param>/// <returns></returns>public string TestMethod(int callDuration,out int threadId){Console.WriteLine("Test method begins:");Thread.Sleep(callDuration);threadId=Thread.CurrentThread.ManagedThreadId;return String.Format("Call time was {0}",callDuration);}}
}

2、使用 EndInvoke 等待異步調用

static void Main(string[] args){int threadId;//創建測試類AsyncDemo asyncDemo = new AsyncDemo();//創建委托TestMethodAsyncCaller caller = new TestMethodAsyncCaller(asyncDemo.TestMethod);//初始化異步調用IAsyncResult result = caller.BeginInvoke(3000, out threadId, null, null);Thread.Sleep(0);Console.WriteLine("Main thread {0} does some work.", Thread.CurrentThread.ManagedThreadId);//調用EndInvoke檢索結果string returnValue = caller.EndInvoke(out threadId, result);Console.WriteLine("The call executed on thread {0},with return value \"{1}\".", threadId, returnValue);Console.ReadLine();}

在這里插入圖片描述
3、使用 WaitHandle 等待異步調用

static void Main(string[] args){int threadId;//創建測試類AsyncDemo asyncDemo = new AsyncDemo();//創建委托TestMethodAsyncCaller caller = new TestMethodAsyncCaller(asyncDemo.TestMethod);//初始化異步調用IAsyncResult result = caller.BeginInvoke(3000, out threadId, null, null);Thread.Sleep(0);Console.WriteLine("Main thread {0} does some work.", Thread.CurrentThread.ManagedThreadId);//sone to do//等待信號result.AsyncWaitHandle.WaitOne();//調用EndInvoke檢索結果string returnValue = caller.EndInvoke(out threadId, result);result.AsyncWaitHandle.Close();Console.WriteLine("The call executed on thread {0},with return value \"{1}\".", threadId, returnValue);Console.ReadLine();}

在這里插入圖片描述
4、對異步調用的完成情況進行輪詢

static void Main(string[] args){int threadId;//創建測試類AsyncDemo asyncDemo = new AsyncDemo();//創建委托TestMethodAsyncCaller caller = new TestMethodAsyncCaller(asyncDemo.TestMethod);//初始化異步調用IAsyncResult result = caller.BeginInvoke(3000, out threadId, null, null);Thread.Sleep(0);Console.WriteLine("Main thread {0} does some work.", Thread.CurrentThread.ManagedThreadId);// 等待完成.while (result.IsCompleted == false){Thread.Sleep(250);Console.Write(".");}//調用EndInvoke檢索結果string returnValue = caller.EndInvoke(out threadId, result);Console.WriteLine("The call executed on thread {0},with return value \"{1}\".", threadId, returnValue);Console.ReadLine();}

在這里插入圖片描述
5、異步調用完成時執行回調方法

static void Main(string[] args){int threadId = 0;//創建測試類AsyncDemo asyncDemo = new AsyncDemo();//創建委托TestMethodAsyncCaller caller = new TestMethodAsyncCaller(asyncDemo.TestMethod);//初始化異步調用IAsyncResult result = caller.BeginInvoke(3000, out threadId, new AsyncCallback(callbackMethod), "The call executed on thread {0},with return value \"{1}\".");Console.WriteLine("Main thread {0} does some work.", Thread.CurrentThread.ManagedThreadId);Thread.Sleep(5000);Console.WriteLine("The main thread ends.");Console.ReadLine();}private static void callbackMethod(IAsyncResult ar){//檢索委托.AsyncResult result = (AsyncResult)ar;TestMethodAsyncCaller caller = (TestMethodAsyncCaller)result.AsyncDelegate;//格式字符串作為狀態信息被傳遞string formatString = (string)ar.AsyncState;int threadId = 0;//調用EndInvoke檢查結果.string returnValue = caller.EndInvoke(out threadId, ar);//用格式字符串格式化輸出信息Console.WriteLine(formatString, threadId, returnValue);}

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/44251.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/44251.shtml
英文地址,請注明出處:http://en.pswp.cn/web/44251.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

算法學習day10(貪心算法)

貪心算法&#xff1a;由局部最優->全局最優 貪心算法一般分為如下四步&#xff1a; 將問題分解為若干個子問題找出適合的貪心策略求解每一個子問題的最優解將局部最優解堆疊成全局最優解 一、擺動序列&#xff08;理解難&#xff09; 連續數字之間的差有正負的交替&…

Maven Nexus3 私服搭建、配置、項目發布指南

maven nexus私服搭建 訪問nexus3官方鏡像庫&#xff0c;選擇需要的版本下載&#xff1a;Docker Nexus docker pull sonatype/nexus3:3.49.0 創建數據目錄并賦權 sudo mkdir /nexus-data && sudo chown -R 200 /nexus-data 運行(數據目錄選擇硬盤大的卷進行掛載) …

mysql快速精通(五)數據庫備份與還原

主打一個實用 對于重要數據我們常常進行備份以應對突發情況&#xff0c;以下使用Navicat對數據進行備份&#xff0c;想了解sql語句的自尋 備份?? 還原??

自動化回復信息工具的開發分享!

在當今信息爆炸的時代&#xff0c;無論是個人還是企業&#xff0c;都面臨著大量的信息處理和回復工作&#xff0c;為了提高效率&#xff0c;自動化回復信息工具變得越來越重要。 本文旨在分享一個簡單但實用的自動化回復信息工具的五段源代碼開發過程&#xff0c;幫助讀者理解…

DNS正向解析,反向解析

目錄 一、正向解析 1.下載DNS軟件包 2.修改主配置文件 3.創建區域文件 4.配置DNS 5.測試 二、反向解析 1.修改主配置文件 2.創建區域文件 3.測試 一、正向解析 1.下載DNS軟件包 [rootwww ~]# yum indtall -y bind注意&#xff1a; 下載軟件前需要配置倉庫&…

DolphinScheduler本地安裝部署與遠程任務調度管理實踐應用

文章目錄 前言1. 安裝部署DolphinScheduler1.1 啟動服務 2. 登錄DolphinScheduler界面3. 安裝內網穿透工具4. 配置Dolphin Scheduler公網地址5. 固定DolphinScheduler公網地址 前言 本篇教程和大家分享一下DolphinScheduler的安裝部署及如何實現公網遠程訪問&#xff0c;結合內…

自動駕駛AVM環視算法--540度全景的算法實現和exe測試demo

參考&#xff1a;金書世界 540度全景影像是什么 540度全景影像是在360度全景影像基礎上的升級功能&#xff0c;它增加了更多的攝像頭來收集周圍的圖像數據。通常&#xff0c;這些攝像頭分布在車輛的更多位置&#xff0c;例如車頂、車底等&#xff0c;以便更全面地捕捉車輛周圍…

無人機游學技術及前景分析

一、技術概述 無人機&#xff0c;即無人駕駛飛行器&#xff0c;通過遠程控制或自主飛行控制系統進行操作。隨著科技的快速發展&#xff0c;無人機技術日益成熟&#xff0c;不僅廣泛應用于軍事偵察、打擊等領域&#xff0c;也逐漸滲透到民用市場&#xff0c;包括農業植保、影視…

PostgreSQL17索引優化之支持并行創建BRIN索引

PostgreSQL17索引優化之支持并行創建BRIN索引 最近連續寫了幾篇關于PostgreSQL17優化器改進的文章&#xff0c;其實感覺還是挺有壓力的。對于原理性的知識點&#xff0c;一方面是對這些新功能也不熟悉&#xff0c;為了盡可能對于知識點表述或總結做到準確&#xff0c;因此需要…

華為認證試題有題庫嗎?華為認證題庫怎么領取?

在競爭激烈的就業環境下&#xff0c;若你擁有華為認證將可以提高個人綜合能力&#xff0c;更好的適應行業變化。相信大家都有聽說過想考取華為初級認證并不困難&#xff0c;因為它有專門的題庫供考生備考。 那么&#xff0c;到底華為認證試題有題庫嗎?華為認證題庫要怎么領取…

java并發編程之美-第1章 并發編程線程基礎-線程的創建與運行

文章目錄 1.什么是線程2. 線程創建和運行 1.什么是線程 進程是操作系統進行資源分配和調度的基本單位&#xff0c;線程是 CPU 分配的基本單位。 程序計數器用來記錄線程當前要執行的指令地址。CPU一般是使用時間片輪轉方式讓線程輪詢占用的&#xff0c;程序計數器是記錄線程…

【Django】報錯‘staticfiles‘ is not a registered tag library

錯誤截圖 錯誤原因總結 在django3.x版本中staticfiles被static替換了&#xff0c;所以這地方換位static即可完美運行 錯誤解決

callBack方式實現threejs點擊事件Raycaster

我用的的示例類發方式來初始化場景。 類里面定義點擊方法。 initMouse(fun) {window.addEventListener("click", (event) > {this.clickObject(event, fun);});}// 鼠標事件clickObject(event, fun) {// 計算點擊位置的歸一化設備坐標const mouse new THREE.Ve…

IO模型理論學習

1、什么是IO 計算機視角下的io AIO

“泰迪·曲靖師范學院數學與統計學院數據科學教學實訓平臺”工作室簽約揭牌儀式圓滿結束

為深化校企合作&#xff0c;實現應用型人才培養目標。泰迪智能科技攜手曲靖師范學院數學與統計學院共建“數據科學教學實訓平臺工作室”。 2024年7月10日&#xff0c;“?泰迪數學與統計學院數據科學教學實訓平臺”工作室揭牌儀式在曲靖師范學院舉行。泰迪智能科技昆明分公司院…

LPRNet 車牌識別部署 rk3588(pt-onnx-rknn)包含各個步驟完整板端代碼

雖然車牌識別技術很成熟了&#xff0c;但完全沒有接觸過。一直想搞一下、整一下、試一下、折騰一下&#xff0c;工作之余找了一個簡單的例子入個門。本博客簡單記錄一下 LPRNet 車牌識別部署 rk3588流程&#xff0c;訓練參考 LPRNet 官方代碼。 1、導出onnx ??導出onnx很容易…

EtherCAT設備配置:SCI EoeMacIp 文件與實際設備配置的比較過程

標題&#xff1a;EtherCAT設備配置&#xff1a;SCI文件與實際設備配置的比較過程 在工業自動化領域&#xff0c;EtherCAT&#xff08;Ethernet for Control Automation Technology&#xff09;作為一種高效的實時以太網協議&#xff0c;正在被廣泛應用。在EtherCAT網絡的配置過…

SW - 將面導出為dxf

文章目錄 SW - 將面導出為dxf概述筆記原點問題END SW - 將面導出為dxf 概述 在做PCB板框. 以前做過一個筆記&#xff0c;用autoCAD來制作導出dxf(cadence SPB17.4 - 用autoCAD2022畫一個PCB板框)。 不喜歡用autoCAD&#xff08;相對麻煩&#xff09;, 還是喜歡用SW&#xff0…

異步日志:性能優化的金鑰匙

一、背景 2024 年 4 月的一個寧靜的夜晚&#xff0c;正當大家忙完一天的工作準備休息時&#xff0c;應急群里“咚咚咚”開始報警&#xff0c;提示我們余利寶業務的贖回接口成功率下降。 通過 Monitor 監控發現&#xff0c;該接口的耗時已經超過了網關配置的超時閾值(2s)&#…

Spring Cloud Alibaba整合Seata實戰

Spring Cloud Alibaba整合Seata實戰 1.啟動Seata Server 1.1 環境準備 1&#xff09;指定nacos作為配置中心和注冊中心 修改registry.conf文件 注意&#xff1a;客戶端配置registry.conf使用nacos時也要注意group要和seata server中的group一致&#xff0c;默認group是&quo…