C# 异步编程Invoke、beginInvoke、endInvoke的用法和作用

C# 异步编程Invoke、beginInvoke、endInvoke的用法和作用

 一、Invoke

Invoke的本质只是一个方法,方法一定是要通过对象来调用的。

一般来说,Invoke其实用法只有两种情况:

Control的Invoke

Delegate的Invoke

也就是说,Invoke前面要么是一个控件,要么是一个委托对象。

Control的Invoke

Control的Invoke一般用于解决跨线程访问的问题,比如你想操作一个按钮button,你就要用button.Invoke,你想操作一个文本label,你就要用label.Invoke,但是大家会发现很麻烦,如果我想既操作button,又操作label,能不能写在一起呢?当然可以。

我们知道,主窗体是一个Form,Form自然也是继承Control的,所以Form也有Invoke的方法,可以直接调用Form.Invoke,这就是我们常见的this.Invoke。这就是为什么有的Invoke前面啥都没有的问题,其实前面是this,只不过省略了。

示例:

this.Invoke(new Action(() =>{ button1.Text = "关闭";}));

Delegate的Invoke

Delegate的Invoke其实就是从线程池中调用委托方法执行,Invoke是同步的方式,会卡住调用它的UI线程。

void PrintMessage(string message) { Console.WriteLine(message); } MyDelegate myDelegate = PrintMessage; myDelegate.Invoke("Hello, World!"); // 使用 Invoke 方法调用委托引用的方法`

beginInvoke、endInvoke

我们已经知道 C#当中 存在async/await 、BackGroudWorker类以及TPL(任务并行库)。当然C#还有一些旧的模式来支持异步编程。

    delegate long MyDel(int first, int second);class Program{static long Sum(int x, int y){Console.WriteLine("------Inside Sum@{0}", DateTime.Now.ToString());Thread.Sleep(2000);return x + y;}static void Main(string[] args){MyDel del = new MyDel(Sum);Console.WriteLine("Before BeginInvoke---@{0}", DateTime.Now.ToString());IAsyncResult iar = del.BeginInvoke(3, 5, null, null);Console.WriteLine("After BeginInvoke@{0}", DateTime.Now.ToString());Console.WriteLine("Doing stuff@{0}", DateTime.Now.ToString());long result = del.EndInvoke(iar);Console.WriteLine("End Invoke@{0}", DateTime.Now.ToString());Console.WriteLine("After EndInvoke:  {0}", result);Console.ReadKey();}}

如上代码,定义了一个委托 MyDel ,并且在调用的时候把Sum方法传给了它的对象。一般情况下我们调用这个委托对象,它就会调用他调用列表中包含的方法。就想调用方法一样,这是同步完成的。

但是如果委托对象在调用列表中只有一个方法(引用方法),它就可以异步的去执行这个方法。BeginInovke和EndInvoke就是用来做这个事的。我们可以用如下的方式使用:

* ①当我们调用BeginInvoke方法的时候,他开始在一个独立的线程上执行引用方法,并且立即返回到原始线程。原始线程可以继续,而引用方法会在想吃的线程中并行执行。
* ②当程序希望获取已完成的异步方法的结果时,可以检查BeginInvoke返回的IAsyncResult的IsCompleted属性,或者调用委托的EndInvoke方法来等待委托执行完成。

上面的使用过程就引出的三种模式:

* ①等待-直到完成 原始线程在发起了异步方法以及做了一些其他处理之后,原始线程就中断并且等待异步方法执行完成之后再继续。

* ②轮询 ,原始线程定期检查发起的线程是否完成,如果没有则可以继续做其他的事情,

* ③回调 原始线程一直执行,无需等待或者检查发起的线程是否完成,发起的线程中的引用发放完成之后,发起的线程会调用回调方法,由回调方法在调用的EndInvoke之前处理异步方法的结果。

借鉴网站:

C#中Invoke和BeginInvoke实际应用详解_C#教程_脚本之家

C#线程委托BeginInvoke与EndInvoke的用法_C#教程_脚本之家

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/373538.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【IEEE官方列表会议,EI, Scopus稳定检索】第三届半导体与电子技术国际研讨会(ISSET 2024,2024年8月23-25)

2024年第三届半导体与电子技术国际研讨会(ISSET 2024)将于2024年8月23-25日在中国西安举行。 ISSET 2024将围绕“半导体”与“电子技术”等相关最新研究领域,为来自国内外高等院校、科学研究所、企事业单位的专家、教授、学者、工程师等提供一…

Ubuntu20.04系统非root用户安装GAMIT10.71

(测试环境:20240701升级包和20240701数据,解算通过) QQ:8212714 群:302883438群文件(source安装包20240701升级包) 1、首先在计算机中安装VMware Workstation 16 Pro。建议:分配…

提高LabVIEW软件通用性的方法

提高LabVIEW软件通用性的方法 在使用LabVIEW开发软件时,提高软件的通用性非常重要。通用性意味着软件可以在不同的应用场景中使用,具备高度的适应性和灵活性,从而提高软件的价值和用户满意度。以下从多个角度详细探讨如何提高LabVIEW软件的通…

二十年大数据到 AI,图灵奖得主眼中的数据库因果循环

最近,MIT 教授 Michael Stonebraker 和 CMU 教授 Andrew Pavlo (Andy) 教授联合发表了一篇数据库论文。Michael Stonebraker 80 高龄,是数据库行业唯一在世的图灵奖得主,Andy 则是业界少壮派里的最大 KOL。 一老一少,当今数据库届…

获超九成Gartner用户力推!FortiGate连续五年斩获“客户之选”称号

近日,Gartner Peer Insights™ 网络防火墙客户之选报告发布,Fortinet 连续第五年荣登这项权威榜单。该评选结果源于广大用户对 Fortinet 防火墙产品的真实反馈,是客户选择 Fortinet 的重要参考依据,也是FortiGate能够占据全球防火…

玩鸣潮提示错误代码126:加载x3daudio1_7.dll失败无法打开的多个详细有效解决方法分享

玩游戏期间你是否也有遇到过找不到x3daudio1_7.dll无法继续执行代码打不开游戏?那么遇到这个问题要怎么办?有什么方法能解决?今天详细给大家介绍一下如何解决找不到x3daudio1_7.dll文件或x3daudio1_7.dll丢失的多个不同方法! 第一…

数据开源 | Magic Data大模型高质量十万轮对话数据集

能够自然的与人类进行聊天交谈,是现今的大语言模型 (LLM) 区别于传统语言模型的重要能力之一,近日OpenAI推出的GPT-4o给我们展示了这样的可能性。 对话于人类来说是与生俱来的,但构建具备对话能力的大模型是一项不小的挑战,收集高…

three-platformize 微信小程序 uniapp 使用截图功能

最近需要将3d场景进行截图,但是网上的各种各样,看的我一团乱麻,因此在解决完后就将这些简单的分享一下; 原理:将3维场景的那个canvas中的像素提取出来,找一个空的canvas二维画布放上去,然后用二…

【鸿蒙学习笔记】Stage模型

官方文档:Stage模型开发概述 目录标题 Stage模型好处Stage模型概念图ContextAbilityStageUIAbility组件和ExtensionAbility组件WindowStage Stage模型-组件模型Stage模型-进程模型Stage模型-ArkTS线程模型和任务模型关于任务模型,我们先来了解一下什么是…

Pearson 相关系数的可视化辅助判断和怎么用

Pearson 相关系数的可视化辅助判断和怎么用 flyfish Pearson 相关系数 是一种用于衡量两个连续型变量之间线性相关程度的统计量。其定义为两个变量协方差与标准差的乘积的比值。公式如下: r ∑ ( x i − x ˉ ) ( y i − y ˉ ) ∑ ( x i − x ˉ ) 2 ∑ ( y i −…

RK3568平台(opencv篇)opencv处理图像视频

一.读取图像文件并展示 灰度图像: 灰度图需要用 8 位二进制来表示,取值范围是 0-255。用 0 表示 0(黑色), 用 255 表示 1(白色),取值越大表示该点越亮。 RGB 彩色图像:…

计算机网络浅谈—什么是 OSI 模型?

开放系统通信(OSI)模型是一个代表网络通信工作方式的概念模型。 思维导图 什么是 OSI 模型? 开放系统互连 (OSI) 模型是由国际标准化组织创建的概念模型,支持各种通信系统使用标准协议进行通信。简单而言,OSI 为保证…

【问题记录】VsCode中以管理员权限运行Powershell

问题展示 今天在尝试运行nodemon命令的时候出问题,显示没法识别,经过分析发现是管理员权限的问题,由于是在vscode里面进行开发,因此特此进行配置。 方法一 直接在vscode命令行中输入如下命令: Start-Process powers…

如何查询并下载韩国签证

登录大韩民国签证门户网站(https://www.visa.go.kr),点击“查询/签发”- “办理进度查询及打印”。 2) 输入护照号码、英文姓名及出生日期后点击查询。 3) 若签证通过,办理状态信息栏下面会显示签证信息。 4)点击“签证…

人生苦短,我用Python+Docker

今天用一个简单的例子,介绍下如何使用Docker进行Python部署。 前期准备 本地需要有Python环境; 一个Linux的服务器并已经装好Docker ; 能把代码上传到服务端的工具。 本文的本地环境是Win10Python3.12,服务器使用Ubuntu的云服…

springboot通江银耳销售管理系统-计算机毕业设计源码15998

摘要 随着人们健康意识的增强,银耳这种传统的中药食材备受关注。而通江银耳是四川省通江县特产,中国国家地理标志产品。四川省通江县是银耳的发源地,中国银耳之乡,通江银耳因主产于此而得名,以其独到的质厚、肉嫩、易炖…

Objective-C 中的 isa 不再是简单的结构体指针

了解 Objective-C 中的 isa 指针内存结构 在 Objective-C 中,isa 指针是对象和类之间的重要桥梁。它不仅帮助运行时系统识别对象的类型,还参与了一些内存和性能优化。本文将深入讲解 isa 指针的内存结构,包括其在早期和现代实现中的演变。 …

彩虹小插画:成都亚恒丰创教育科技有限公司

彩虹小插画:色彩斑斓的梦幻世界 在繁忙的生活节奏中,总有一抹温柔的色彩能悄然触动心弦,那就是彩虹小插画带来的梦幻与宁静。彩虹,这一自然界的奇迹,被艺术家们巧妙地融入小巧精致的插画之中,不仅捕捉了瞬…

海外金融机构银行保险证券数字化转型营销销售数字化成功案例讲师培训师讲授开户销售营销客户AI人工智能创新思维

金融机构需要数字营销的主要原因 数字银行、直接存款和移动网络的兴起让客户无需前往当地分行即可轻松办理银行业务。这些举措不仅提升了用户体验,也迫使银行向数字化世界迈进。 金融服务公司需要在数字营销渠道上保持稳固的地位,以免落后于大型机构。…