当前位置: 首页 > news >正文

C#异步委托的三种实现 BeginInvoke / EndInvoke / IsCompleted

  • 本文将介绍C#异步委托的三种实现方式,并给出相关示例代码及解析。

注意事项

    1. 用委托开启线程的前提是:创建项目时必须选择“.NET Framework",如果选择的是”.Net Core“,在调用BeginInvoke时,系统会报错”Operation is not supported on this platform.“。
    1. 异步调用的另一个前提是:委托的方法列表中只能包含一个方法。

等待至完成

  • 通过BeginInvoke和EndInvoke实现。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;namespace FrameworkDemo
{public delegate long MyDel(int a, int b);class Program{static long sum(int a, int b) {Thread.Sleep(10 * 1000);return a + b;}static void Main(string[] args){// 异步委托操作描述IAsyncResult res = null;long result = 0;AsyncCallback callback = ar =>{// 输出结果:“计算结果为:11”Console.WriteLine($"{ar.AsyncState}{result}");};MyDel del = new MyDel(sum);// BeginInvoke开启异步调用// res的打印结果为System.Runtime.Remoting.Messaging.AsyncResultres = del.BeginInvoke(3, 8, callback, "计算结果为");  // 等待线程结束,并获取返回值result = del.EndInvoke(res);Console.ReadLine();}}
}
  • BeginInvoke函数的最后两个参数分别是一个回调函数,以及传入这个回调函数的参数。当委托线程运行结束后,会自动运行这个回调函数。之前的参数个数及类型取决于定义委托时参数的类型和个数。
  • IAsyncResult类型表示对异步委托操作的描述,一调用异步委托,就立刻会在主函数中得到这个返回值,打印结果为“System.Runtime.Remoting.Messaging.AsyncResult”。
  • EndInvoke会把主线程卡主,知道异步委托方法结束,此时将之前拿到的异步委托操作描述作为参数传入,即可获得异步委托函数的真正返回值。

轮询模式

  • 通过IsCompleted实现。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;namespace FrameworkDemo
{public delegate long MyDel(int a, int b);class Program{static long sum(int a, int b) {Thread.Sleep(10 * 1000);return a + b;}static void Main(string[] args){// 异步委托操作描述IAsyncResult res = null;long result = 0;AsyncCallback callback = ar =>{// 输出结果:“计算结果为:11”Console.WriteLine($"{ar.AsyncState}{result}");};MyDel del = new MyDel(sum);// BeginInvoke开启异步调用// res的打印结果为System.Runtime.Remoting.Messaging.AsyncResultres = del.BeginInvoke(3, 8, callback, "计算结果为");while (!res.IsCompleted) {/*一系列想要的操作*/}// 等待线程结束,并获取返回值result = del.EndInvoke(res);Console.ReadLine();}}
}
  • 之前我们调用BeginInvoke后,直接调用EndInvoke,这使得主线程一直卡主,直到委托线程返回,通过IsComplated进行轮询线程状态,我们可以在循环中利用等待时间,执行一些别的想要的工作。

回调

  • 关于回调函数,比较标准的写法如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Remoting.Messaging;
using System.Text;
using System.Threading;
using System.Threading.Tasks;namespace FrameworkDemo
{public delegate long MyDel(int a, int b);class Program{static long sum(int a, int b) {Thread.Sleep(10 * 1000);return a + b;}// 异步委托执行完成后需要调用的回调函数static void testCallback(IAsyncResult ar) {System.Runtime.Remoting.Messaging.AsyncResult varResult =(System.Runtime.Remoting.Messaging.AsyncResult)ar;MyDel test = (MyDel)varResult.AsyncDelegate;long result = test.EndInvoke(ar);Console.WriteLine($"{ar.AsyncState}: {result}");}static void Main(string[] args){           MyDel del = new MyDel(sum);AsyncCallback asyncTest = new AsyncCallback(testCallback);del.BeginInvoke(3, 8, asyncTest, "计算结果为");Console.ReadLine();}}
}
  • 当异步委托运行结束后,系统会自动调用回调函数,并将异步委托描述信息IAsyncResult作为参数传入回到函数中,因此我们需要做的就是解析异步委托描述信息。

相关文章:

C#异步委托的三种实现 BeginInvoke / EndInvoke / IsCompleted

本文将介绍C#异步委托的三种实现方式,并给出相关示例代码及解析。 注意事项 用委托开启线程的前提是:创建项目时必须选择“.NET Framework",如果选择的是”.Net Core“,在调用BeginInvoke时,系统会报错”Operati…...

在HTTP请求中安全传输base64编码的字符串

前言 base64是一种常见的的编码格式,它可以把二进制数据编码成一个由大小写英文字母(a-zA-Z)、阿拉伯数字(0-9),以及三个特殊字符、/、组成的字符串。 问题 但是在URL传输中,、/、这三个特殊…...

05预测识别-依托YOLO V8进行训练模型的识别——对视频中的图片进行识别

在前面的一些章节中,我们已经讲如何准备打标签的素材、如何制作标签、如何训练以及得到我们最终需要的用于YOLO目标识别的模型。那么现在我们就要正式开始,利用我们训练得到的best.pt,这个模型文件来对图片视频进行识别。 1、基本思路 公安交管场景中,我们经常会遇到需要…...

LeetCode算法题---第3天

注:大佬解答来自LeetCode官方题解 121.买卖股票的最佳时期 1.题目 2.个人解答 function maxProfit(prices) {//更新最低价格和最大利润let minPrice prices[0];let maxProfit 0;for (let i 1; i < prices.length; i) {// 如果当前价格比最低价格还低&#xff0c;更新最…...

欧洲FBA专线海运与陆运的差别

随着全球电商市场的快速发展&#xff0c;越来越多的卖家选择将产品销售到欧洲市场。然而&#xff0c;面对欧洲境内的物流问题&#xff0c;卖家们往往会面临一个重要的选择&#xff1a;选择欧洲FBA专线时是选择海运还是陆运?这两种运输方式在时效、成本和服务质量上都有所不同&…...

UDS诊断

一、UDS诊断简介 汽车诊断技术是指在不拆卸车辆的情况下&#xff0c;通过读取车辆在运行过程中所记录的数据或故障码来查明故障原因&#xff0c;并确定故障部位的汽车应用技术。通过诊断&#xff0c;可以快速检测到汽车故障来提高汽车安全性和维修效率。 USD协议诊断主要采用“…...

计算材料学学习记录1

计算材料学学习记录1 平台&#xff1a;Bohrium 老师&#xff1a;单斌教授 文章目录 1.发展史背景计算材料学 2.计算方法分类3.计算材料学的应用 1.发展史 背景 材料的研究方法发展&#xff1a; 一切靠实验理论开始起作用理论撑起半边天 “……解决全部化学的规律的数学方法…...

PHP8中的构造方法和析构方法-PHP8知识详解

今日分享的内容是php8中的构造方法和析构方法&#xff0c;我们把构造方法和析构方法这两个方法分开来讲&#xff1a; 1、构造方法 构造方法存在于每个声明的类中&#xff0c;主要作用是执行一些初始化任务。如果类中没有直接声明构造方法&#xff0c;那么类会默认地生成一个没…...

【GPU编程】Visual Studio创建基于GPU编程的项目

vs创建基于GPU编程的项目 &#x1f34a;前言&#x1f438;方法一-CUDA Runtime生成&#x1f61d;debug设置 &#x1f345;方法二-空项目配置&#x1f349;&#x1f349;&#x1f349;代码验证 &#x1f34a;前言 cuda以及cudnn的安装以及系统环境变量的配置默认已经做完。如果…...

MySQL面试题-索引的基本原理及相关面试题

先了解一下MySQL的结构 下面我们重点讲一下存储引擎 MySQL的数据库和存储数据的目录是一一对应的&#xff0c;这些数据库的文件就保存在磁盘中对应的目录里 下面我们来看一下对应的具体数据文件 .frm是表的结构&#xff0c;不管什么样的索引都会有 .ibd代表我们现在使用的存…...

MySQL学习笔记19

MySQL日志文件&#xff1a;MySQL中我们需要了解哪些日志&#xff1f; 常见日志文件&#xff1a; 我们需要掌握错误日志、二进制日志、中继日志、慢查询日志。 错误日志&#xff1a; 作用&#xff1a;存放数据库的启动、停止和运行时的错误信息。 场景&#xff1a;用于数据库的…...

为什么u盘在mac上显示不出来

插入U盘是个看似简单的操作&#xff0c;但有时候在Mac电脑上却出现了无法显示U盘的情况。这样的问题是非常让人头疼的&#xff0c;特别是当你急需使用U盘中的文件时。那么&#xff0c;究竟为什么U盘在Mac上会显示不出来呢&#xff1f;今天就让我们一起来深入了解一下这个问题&a…...

【golang】调度系列之sysmon

调度系列 调度系列之goroutine 调度系列之m 调度系列之p 在golang的调度体系中&#xff0c;除了GMP本身&#xff0c;还有另外一个比较重要的角色sysmon。实际上&#xff0c;除了GMP和sysmon&#xff0c;runtime中还有一个全局的调度器对象。但该对象只是维护一些全局的数据&…...

货物寄到英国选择什么物流比较划算?

随着全球化的发展&#xff0c;越来越多的企业开始将产品销售到海外市场&#xff0c;其中英国作为一个重要的贸易伙伴&#xff0c;吸引了大量的中国企业的关注。然而&#xff0c;如何将货物安全、快速地运送到英国&#xff0c;成为了众多企业面临的一个问题。那么&#xff0c;货…...

vite + react 基本项目搭建

新建项目步骤略过 1、下载scss 无需任何配置就可以直接使用scss了 pnpm install sass使用scss配置全局颜色变量 新建/src/styles/variable.scss并在 $primary: #76aef9在vite.cinfig.js里配置 export default defineConfig({css: {preprocessorOptions: {scss: {javascrip…...

一个方法解决三道区间问题

1288. 删除被覆盖区间 56. 合并区间 986. 区间列表的交集 # 1288. 删除被覆盖区间 class Solution:def removeCoveredIntervals(self, intervals: List[List[int]]) -> int:# 按照起点升序排列&#xff0c;起点相同时&#xff0c;按照终点降序排列intervals.sort(key lamb…...

sub0 里斯本精彩回顾:探索波卡区块的创新空间

sub0 Europe 2023 已在葡萄牙里斯本圆满结束&#xff01;sub0 大会是波卡生态开发者大会&#xff0c;由波卡协议的主要开发方 Parity Technologies 举办的开发者大会&#xff0c;汇聚了全球 Substrate 开发者和学习者&#xff0c;旨在为 Polkadot 和 Kusama 生态的开发者、贡献…...

颜色+情感的英语表达还有这些,零基础学英语口语去哪里,柯桥有推荐的吗?

当我们探讨关于"blue"&#xff08;蓝色&#xff09;的多义性时&#xff0c;我们会发现英语中有许多其他词汇也有类似的双关意义。 既可以表示一种颜色或物理属性&#xff0c;又可以代表一种情感或心理状态。 这种现象在语言中很常见&#xff0c;反映了语言的丰富性和…...

exoplayer的使用-6,播放器的选择

需要一个能播放蓝光的,高码率的播放器,在使用现成的播放器的基础上,可选的有几个,exoplayer,vlc,ijk,mpv. exoplayer的更新频繁,适应性强,扩展性一般,因为它基于系统的硬解,音频可扩展,使用ffmpeg可以解决. 有国际化支持,音频,字幕这些显示效果好. 对杜比视频,hdr这些支持看设…...

Windows上安装 Go 环境

一、下载go环境 下载go环境&#xff1a;Go下载官网链接找到自己想下载的版本&#xff0c;点击下载&#xff0c;比如我这是windows64位的&#xff0c;我就直接点击最新的。 二、安装go环境 双击下载的.msi文件 next next 他默认的是c盘&#xff0c;你自己可以改&#xff0c;然…...

WarcraftHelper魔兽争霸插件:5分钟解决老游戏兼容性问题,让经典重获新生

WarcraftHelper魔兽争霸插件&#xff1a;5分钟解决老游戏兼容性问题&#xff0c;让经典重获新生 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为…...

百考通:AI赋能让学术研究起步更高效

对于每一位学子与科研人而言&#xff0c;开题报告是学术研究的“第一粒扣子”&#xff0c;它不仅是研究方向的蓝图&#xff0c;更是顺利推进论文写作、获得导师认可的关键。然而&#xff0c;选题迷茫、文献梳理繁琐、逻辑框架搭建困难等问题&#xff0c;常常让开题之路步履维艰…...

MusePublic Art Studio惊艳效果:动态种子演化生成同主题12张连贯艺术组图

MusePublic Art Studio惊艳效果&#xff1a;动态种子演化生成同主题12张连贯艺术组图 1. 引言&#xff1a;当AI成为艺术家的画笔 想象一下&#xff0c;你是一位艺术家&#xff0c;脑海中有一个绝妙的创意主题。你想围绕这个主题创作一个系列作品&#xff0c;比如“赛博朋克森…...

从安全卫士到AI指挥官:周鸿祎的“AI突围”实录!

2026年3月27日&#xff0c;北京——在360总部楼下&#xff0c;一张临时搭建的长桌上&#xff0c;周鸿祎身穿印有“AI世界”的黑色工装马甲&#xff0c;手握键盘&#xff0c;亲自为现场观众“装龙虾”。这幅画面不仅让人恍惚回到十几年前的中关村&#xff0c;也标志着一场关于AI…...

安卓蓝牙开发避坑指南:Bluedroid初始化流程中的5个关键细节

安卓蓝牙开发避坑指南&#xff1a;Bluedroid初始化流程中的5个关键细节 在安卓蓝牙协议栈开发中&#xff0c;Bluedroid的初始化流程是系统与蓝牙硬件建立通信的基础桥梁。许多看似随机的蓝牙功能异常&#xff0c;往往源于初始化阶段某些参数的微妙配置差异。本文将深入剖析五个…...

Anything V5镜像实战:从部署到生成你的第一张二次元头像

Anything V5镜像实战&#xff1a;从部署到生成你的第一张二次元头像 1. 项目介绍与核心价值 Anything V5是基于Stable Diffusion技术优化的高质量二次元图像生成模型。相比通用版本&#xff0c;它特别擅长生成动漫风格的人物肖像、场景插画等作品&#xff0c;在细节表现和风格…...

墨语灵犀开源模型生态:对接LangChain/RAG构建专属翻译知识库

墨语灵犀开源模型生态&#xff1a;对接LangChain/RAG构建专属翻译知识库 1. 引言&#xff1a;当古典美学遇见现代AI架构 在人工智能技术快速发展的今天&#xff0c;翻译工具已经从简单的词汇转换演变为理解文化语境和语义深度的智能系统。「墨语灵犀」作为基于腾讯混元大模型…...

微信公众号开发入门:手把手教你配置接口信息(含服务器设置指南)

微信公众号开发从零到一&#xff1a;接口配置全流程详解 第一次接触微信公众号开发时&#xff0c;很多人会被"接口配置"这个概念吓到。作为一个从零开始摸索过来的开发者&#xff0c;我深知那种面对陌生术语时的茫然感。实际上&#xff0c;接口配置并没有想象中那么复…...

OpenSpec 生成文件说明

proposal.md —— 为什么做、做什么&#xff08;产品/范围&#xff09; Why&#xff1a;要解决什么问题、机会是什么。What Changes&#xff1a;会新增/改掉/删掉哪些能力&#xff0c;有没有 BREAKING。Capabilities&#xff1a;会动到哪些能力名&#xff08;对应后面 specs/&l…...

从CentOS 7迁移到Ubuntu 22.04 LTS,我整理了一份保姆级系统初始化脚本(含内核调优、换源、时区设置)

从CentOS 7迁移到Ubuntu 22.04 LTS&#xff1a;系统初始化与性能调优全指南 当CentOS 7走向生命周期的终点&#xff0c;许多运维团队正面临向新平台的战略转移。Ubuntu 22.04 LTS以其长期支持特性和活跃的社区生态&#xff0c;成为最受欢迎的替代选择之一。但迁移绝非简单的系统…...