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.mzph.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很容易…

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…

Linux--生产消费模型

线程系列&#xff1a; Linux–线程的认识(一) Linux–线程的分离、线程库的地址关系的理解、线程的简单封装&#xff08;二&#xff09; 线程的互斥&#xff1a;临界资源只能在同一时间被一个线程使用 生产消费模型 生产消费模型是多线程编程和分布式系统中的一个经典概念&…