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

c#学习系列相关之多线程(三)----invoke和begininvoke

一、invoke和BeginInvoke的作用

       invokebegininvoke方法的初衷是为了解决在某个非某个控件创建的线程中刷新该控件可能会引发异常的问题。说的可能比较拗口,举个例子:主线程中存在一个文本控件,在一个子线程中要改变该文本的值,此时会有可能引发异常。windows GUI编程有一个规则,就是只能通过创建控件的线程来操作控件的数据,否则就可能产生不可预料的结果。

二者的使用情况有两种:

1.在控件下应用,实例类型是个control例如button等;

2.在委托下进行使用,实例对象是一个委托类型,在使用时候会跳到当前线程。

invoke和begininvoke的区别:

1、Invoke() 调用时,Invoke会阻止当前主线程的运行,等到 Invoke() 方法返回才继续执行后面的代码,表现出“同步”的概念。
2、BeginInvoke() 调用时,当前线程会启用线程池中的某个线程来执行此方法,BeginInvoke不会阻止当前主线程的运行,而是等当前主线程做完事情之后再执行BeginInvoke中的代码内容,表现出“异步”的概念。在想获取 BeginInvoke() 执行完毕后的结果时,调用EndInvoke() 方法来获取。而这两个方法中执行的是一个委托。

二、Invke用法示例

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;namespace 线程test1005
{public delegate void test(string s1);class Program{static void Main(string[] args){test tt = new test(t1);Thread thread = new Thread(() => {tt.Invoke("你好");});thread.Start();string obj = Thread.CurrentThread.ManagedThreadId.ToString();Console.WriteLine("主线程的ID" + " :" + obj);Console.Read();}static void t1(string s1){string obj = Thread.CurrentThread.ManagedThreadId.ToString();Console.WriteLine(s1+"支线程的ID" +" :"+obj);}}

提示:本人准备建立一个技术交流群,会将日常学习工作中遇到的问题和解决方案进行分享,同时也会将代码和学习资料上传进去,有什么不懂的问题可以咨询我!+v:SJS66-12

生活所迫打个广告,本人也代购莆田鞋,不是中间商,工厂直接取货,价格优惠质量保证,都是我自己前去挑选,可以视频选购验货!!希望大家支持!!!赚点生活费!!!+v:SJS66-12
 

三、BeginInvoke用法示例

invoke和begininvoke对比:

1.invoke用法:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;namespace 线程test1005
{public delegate void test(string s1);class Program{static void Main(string[] args){test tt = new test(t1);tt.Invoke("你好");for (int i = 0; i < 300; i++){Console.Write(3);}Console.Read();}static void t1(string s1){for (int i = 0; i < 300; i++){Console.Write(2);}string obj = Thread.CurrentThread.ManagedThreadId.ToString();Console.WriteLine(s1+"支线程的ID" +" :"+obj);}}
}

由结果可以看出invoke是依次按顺序向下执行;

2.beginInvoke用法:

首先介绍一下begininvoke的参数,其中作重要的就是后两个参数这里使用了BeginInvoke方法的最后两个参数,如果被调用的方法含有参数的话,这些参数将作为BeginInvoke的前面一部分参数,(就是 传入调用方法的参数)如果没有参数,BeginInvoke就只有两个参数。第一个参数是回调方法委托类型,这个委托只有一个参数,就是IAsyncResult,如MethodCompleted方法所示。当method方法执行完后,系统会自动调用MethodCompleted方法,传入的其实也是调用方法的返回类型,BeginInvoke的第二个参数需要向MethodCompleted方法中传递一些值,一般可以传递被调用方法的委托类型。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;namespace 线程test1005
{public delegate void test(string s1);class Program{static void Main(string[] args){test tt = new test(t1);tt.BeginInvoke("111", (a) =>{for (int i = 0; i < 300; i++){Console.Write(1);}}, null);for (int i = 0; i < 300; i++){Console.Write(3);}Console.Read();}static void t1(string s1){for (int i = 0; i < 300; i++){Console.Write(2);}string obj = Thread.CurrentThread.ManagedThreadId.ToString();Console.WriteLine(s1+"支线程的ID" +" :"+obj);}}
}

由运行结果可以知道,begininvoke可以继续执行调用方法后的函数,关于begininvoke的具体用法可以参考该文章:Delegate的BeginInvoke()_begininvoke参数-CSDN博客

例子:

static void Main(string[] args){Console.WriteLine("主线程的ID:" + Thread.CurrentThread.ManagedThreadId);//标记显示主  线程IDSayHello sayhello = new SayHello(Say);IAsyncResult iResult=sayhello.BeginInvoke("Olive",new AsyncCallback(Result), sayhello);//三个参数:1、Say()函数的参数,2、AsyncCallback类型的委托,(异步操作结束后执行的委托函数),3、将sayhello对象作为状态参数,在Result函数中会有用到该参数Console.ReadKey();}//AsyncCallback委托所执行的函数private static void Result(IAsyncResult iasyncresult){SayHello sayhello = (SayHello)iasyncresult.AsyncState;//获取IAsyncResult对象的AsyncState的属性,即为Delegate.BeginInvoke()的第三个参数即sayhello。string s = sayhello.EndInvoke(iasyncresult);Console.WriteLine(s + "------好了,异步调用到这里已经结束了");}private static string  Say(string name){Console.WriteLine("Hello!--------" + name);Console.WriteLine("当前的线程ID为:" + Thread.CurrentThread.ManagedThreadId);return "I Love you " + name;}

提示:1.begininvoke的返回值类型为IAsyncResult ,并且返回值会继续作为参数传入后续的AsyncCallback回调函数中Result。

2.函数的实际返回值需要通过EndInvoke进行获取!

参考文章:

控件和delegate的Invoke、BeginInvoke用法总结及基本逻辑_richtextbox1.begininvoke_勉之1.2.6的博客-CSDN博客C# 关于Invoke(详解)_c# invoke-CSDN博客

BeginInvoke 用法 2 - 异步返回_begininvoke用法-CSDN博客

C#学习笔记--BeginInvoke和EndInvoke的基本用法-CSDN博客

相关文章:

c#学习系列相关之多线程(三)----invoke和begininvoke

一、invoke和BeginInvoke的作用 invoke和begininvoke方法的初衷是为了解决在某个非某个控件创建的线程中刷新该控件可能会引发异常的问题。说的可能比较拗口&#xff0c;举个例子&#xff1a;主线程中存在一个文本控件&#xff0c;在一个子线程中要改变该文本的值&#xff0c;此…...

如何使用 ONLYOFFICE API 转换办公文档格式

作者&#xff1a;天哥 上一期我们介绍了 ONLYOFFICE 的文档生成器API接口函数库。这一期我们继续介绍ONLYOFFICE 的文件转换API接口函数库。 为什么要使用 ONLYOFFICE 转换API ONLYOFFICE 转换 API 有助于转换大部分类型的Office文档&#xff1a;文本、表格、幻灯片、表单、P…...

最新抖音去水印PHP源码 非第三方接口

简介&#xff1a; 最新抖音去水印PHP源码 非第三方接口 源码全开源 视频解析接口来自官方抖音视频接口!非第三方接口!上传PHP环境中即可运行!支持上传二级目录访问! 访问你的域名地址/douyin.php douyin.php(此文件可以自行重新命名) 支持带有文本的链接和视频ID或者分享的…...

MYSQL 高级SQL语句(二)

表连接查询 MYSQL数据库中的三种连接&#xff1a; inner join(内连接)&#xff1a;只返回两个表中联结字段相等的行&#xff08;有交集的值&#xff09;left join(左连接)&#xff1a;返回包括左表中的所有记录和右表中联结字段相等的记录right join(右连接)&#xff1a;返回…...

本地计算机端口显示CLOSE_WAIT、TIME_WAIT、ESTABLISHED、三种情况的区别

本地计算机端口显示 “CLOSE_WAIT”、“TIME_WAIT” 和 “ESTABLISHED” 表示不同的TCP连接状态&#xff0c;它们之间的区别如下&#xff1a; CLOSE_WAIT&#xff08;关闭等待&#xff09;&#xff1a; 在此状态下&#xff0c;本地计算机已经接收到来自远程计算机的关闭请求&am…...

粘性文本整页滚动效果

效果展示 CSS 知识点 background 相关属性综合运用position 属性的 sticky 值运用scroll-behavior 属性运用scroll-snap-type 属性运用scroll-snap-align 属性运用 整体页面效果实现 <div class"container"><!-- 第一屏 --><div class"sec&qu…...

【Oracle】Oracle系列十九--Oracle的体系结构

文章目录 往期回顾前言1. 物理结构2. 内存结构2.1 SGA2.2 后台进程 3. 逻辑结构 往期回顾 【Oracle】Oracle系列之一–Oracle数据类型 【Oracle】Oracle系列之二–Oracle数据字典 【Oracle】Oracle系列之三–Oracle字符集 【Oracle】Oracle系列之四–用户管理 【Oracle】Or…...

Flink-SQL join 优化 -- MiniBatch + local-global

背景 问题1. 近期在开发flink-sql期间&#xff0c;发现数据在启动后&#xff0c;任务总是进行重试&#xff0c;运行一段时间后&#xff0c;container心跳超时&#xff0c;内存溢出&#xff0c;作业无法进行正常工作 023-10-07 14:53:30,408 | INFO | [flink-akka.actor.defa…...

在c#中使用NPOI结合Magicodes.IE.excel将xlsx文件内存中转换为xls文件

项目中使用Magicodes.IE作为导出excel的组件&#xff0c;但只支持新格式xlsx&#xff0c;有需求要导出旧格式xls文件&#xff0c;因此只能考虑转换的方案&#xff0c;经多种方案尝试和查找相关解决方案&#xff0c;在一份使用NPOI转换的xlsx到xls的文章到找到相关代码&#xff…...

面试经典 150 题 14 —(数组 / 字符串)— 134. 加油站

134. 加油站 方法一 class Solution { public:int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {int minSpare std::numeric_limits<int>::max(); // 初始化最小剩余汽油量为整型的最大值int spare 0; // 当前剩余汽油量int len g…...

如何设计一个安全的对外接口?

转载 https://blog.csdn.net/weixin_46742102/article/details/108831868?spm1001.2101.3001.6650.1&utm_mediumdistribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-108831868-blog-125359890.235%5Ev38%5Epc_relevant_anti_t3_base&depth_1-utm_…...

模拟pdf运行js脚本触发xss攻击及防攻击

一、引入pdfbox依赖 <dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>3.0.0</version> </dependency> 二、生成一个带js脚本的pdf文件 //Creating PDF document object PDDocum…...

【数据结构】树和二叉树概念及其结构

目录 一 树概念及结构 1 树的概念 2 树的相关概念 3 树的表示 二 二叉树概念及结构 1 概念 2 特殊二叉树 3 二叉树的性质 一 树概念及结构 1 树的概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集…...

刘京城:我的《软件方法》学习经历(有彩蛋)

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 写在前面&#xff08;潘加宇&#xff09; 下面是刘京城写的关于他学习《软件方法》的经历。我在前面啰嗦几句。 我做软件建模方面的研究和普及工作已经24年了&#xff0c;和各行各业…...

浏览器详解(四) 渲染

大家好&#xff0c;我是半虹&#xff0c;这篇文章来讲浏览器渲染 1、基本介绍 浏览器是多进程多线程的架构&#xff0c;包括有浏览器进程、渲染器进程、GPU 进程、插件进程等 在上篇文章中我们介绍过浏览器进程&#xff0c;作为浏览器主进程&#xff0c;负责浏览器基本界面的…...

idea新建一个module时,文件夹显示灰色/pom.xml文件显示灰色且中间有条横线

1.问题 2.解决方法 File->Settings->Ignored Files->找到勾选的pom.xml文件&#xff0c;取消勾选&#xff0c;点击ok即可。 3.已解决...

NoSQL数据库(林子雨慕课课程)

文章目录 5.1 NoSQL数据库5.2 NoSQL和关系数据库的比较5.3 四大类型NoSQL数据库5.3.1 键值数据库和列族数据库5.3.2 文档数据库、图数据库、以及不同数据库比较分析 5.4 NoSQL数据库的理论基石CAP理论&#xff1a;BASE理论&#xff1a;Eventual consistency&#xff08;最终一致…...

模拟器运行在AndroidStudio内部,设置其独立窗口显示

在窗口内部运行 设置成独立窗口 Android Studio->Settings或Preferences->Tools->Emulator->取消勾选Launch in the Running Devices tool window --->点击右下角的OK按钮 ---> 重启Android Studio 再次启动模拟器...

计算机网络 | 体系结构

计算机网络 | 体系结构 计算机网络 | 体系结构概念及功能计算机网络简介计算机网络的功能因特网发展阶段小结 组成与分类计算机网络的组成计算机网络的分类小结 标准化工作及相关组织速率相关性能指标速率带宽吞吐量小结 时延相关性能指标时延时延带宽积往返时延RTT利用率小结 …...

ELK 处理 SpringCloud 日志

在排查线上异常的过程中&#xff0c;查询日志总是必不可缺的一部分。现今大多采用的微服务架构&#xff0c;日志被分散在不同的机器上&#xff0c;使得日志的查询变得异常困难。工欲善其事&#xff0c;必先利其器。如果此时有一个统一的实时日志分析平台&#xff0c;那可谓是雪…...

Unity Il2CppDumper原理与实战:解析元数据与二进制对齐

1. 这不是“破解工具”&#xff0c;而是Unity开发者该懂的二进制真相课 你刚在Unity Asset Store下载了一个功能惊艳的插件&#xff0c;却在打包iOS后发现部分逻辑失效&#xff1b;或者接手一个没有源码的旧项目&#xff0c;只有一堆 .dll 和 .so 文件&#xff0c;连主入口…...

服务器日志分析实战:用Python追踪HTTP 404错误并可视化异常频率

作为一名爬虫开发者或网站运维人员,服务器日志就像飞机的“黑匣子”——它记录了每个请求的来龙去脉。而404错误(页面未找到)尤其值得关注:它可能是用户输错了网址,可能是你爬虫的URL构造逻辑有漏洞,也可能是网站改版后旧的链接失效了。更严重的是,大量突然涌出的404请求…...

可解释AI新突破:基于局部帕累托最优的模型解释框架

1. 项目概述&#xff1a;当AI模型成为“黑箱”&#xff0c;我们如何撬开它&#xff1f;在机器学习项目里摸爬滚打十几年&#xff0c;我见过太多这样的场景&#xff1a;团队花大力气训练出一个准确率高达95%的复杂模型&#xff08;比如深度神经网络&#xff09;&#xff0c;业务…...

百度文心一言开发者如何通过Taotoken低成本接入多模型API

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 百度文心一言开发者如何通过Taotoken低成本接入多模型API 对于已经熟悉并正在使用百度文心一言等国产大模型API的开发者而言&#…...

从安装到排错:手把手解决Linux服务器上Nacos启动失败的十大常见问题

从安装到排错&#xff1a;手把手解决Linux服务器上Nacos启动失败的十大常见问题当你在Linux服务器上部署Nacos时&#xff0c;是否遇到过启动失败却无从下手的困境&#xff1f;作为阿里巴巴开源的服务发现和配置管理平台&#xff0c;Nacos在微服务架构中扮演着重要角色。然而&am…...

Matlab,plot绘图如何添加边框

matlab生成的图——编辑(E)——坐标区属性(A)——框样式——Box&#xff0c;勾选效果&#xff1a;...

基于Arduino与433MHz射频的智能灯光定时系统设计与实现

1. 项目概述&#xff1a;告别机械定时器&#xff0c;打造智能灯光管家家里前后院的照明&#xff0c;还有出门度假时屋内的几盏灯&#xff0c;过去一直靠四个老旧的机械定时器来管理。说实话&#xff0c;这玩意儿用起来真是费劲。它的核心问题在于“死板”——你设定好晚上7点开…...

qobuz-dl终极实战指南:专业无损音乐下载工具架构解析与高效应用

qobuz-dl终极实战指南&#xff1a;专业无损音乐下载工具架构解析与高效应用 【免费下载链接】qobuz-dl A complete Lossless and Hi-Res music downloader for Qobuz 项目地址: https://gitcode.com/gh_mirrors/qo/qobuz-dl 在数字音乐时代&#xff0c;追求极致音质的音…...

智能烹饪助手:基于传感器融合与AI的厨房自动化实践

1. 项目概述&#xff1a;一个让厨房小白也能自信下厨的智能伙伴每次站在灶台前&#xff0c;你是不是也经历过这样的场景&#xff1a;一边手忙脚乱地翻着菜谱&#xff0c;一边担心锅里的菜是不是快糊了&#xff0c;还要分心去计算各种调料该放多少&#xff1f;对于很多刚接触烹饪…...

Win11Debloat:Windows系统精简与隐私保护的专业解决方案

Win11Debloat&#xff1a;Windows系统精简与隐私保护的专业解决方案 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutter and …...