(十七)Async异步和多线程-语言进阶1

news2024/11/19 16:22:59

(十七)Async异步和多线程-语言进阶1

  • 一、进程-线程-多线程,同步和异步
      • 1.概念
      • 2.同步和异步
      • 3.异步与多线程异同点
  • 二、委托启动异步调用
      • 1.同步方法
      • 2.异步方法
  • 三、多线程的特点
  • 四、异步的回调和状态参数
      • 1.顺序控制
      • 2.状态参数
  • 五、异步等待三种方式
      • 1. Thread.sleep等待
      • 2.asyncResult.AsyncWaitHandle.WaitOne()
      • 3.action.EndInvoke()
  • 六、异步返回值

一、进程-线程-多线程,同步和异步

1.概念

  1. 进程:进程是一个程序运行时,占用全部计算资源的总和,指在系统中正在运行的一个应用程序;程序一旦运行就是进程;或者更专业化来说:进程是指程序执行时的一个实例,即它是程序已经执行到课中程度的数据结构的汇集。从内核的观点看,进程的目的就是担当分配系统资源(CPU时间、内存等)的基本单位。

  2. 线程:线程是程序执行流的最小单位,系统分配处理器时间资源的基本单元,或者说进程之内独立执行的一个单元执行流。任何操作都是由线程完成的;线程是依托于进程存在的,一个进程可以包含多个线程;线程也可以有自己的计算资源;
    进程——资源分配的最小单位,线程——程序执行的最小单位。

  3. 多线程:多个执行流同时运行。
    (1) CPU太快了,分时间片–上下文切换(加载环境–计算–保存环境)微观角度,一个核同一时刻只能执行一个线程;宏观的来说是多线程并发
    (2) 名CPU多核可以独立工作,例如我们常说的 “4核8线程”–其中核是物理的核 8线程是指虚拟核,并不是上述我们所说的线程。

  4. Thread:是c#语言对线程对象的封装

2.同步和异步

  1. 同步:完成计算之后在进入下一行
  2. 异步:不会等待方法的完成,会直接进入下一行,不会阻塞。
    例如我们举一个贴切的例子,
    同步:
    “你和朋友去吃饭,但他有点忙,你就等他忙完一起吃,这就是同步方法”
    异步:
    “你和朋友去吃饭,但他有点忙,你就自己先去吃,他忙完自己再去吃,这就是异步方法”

3.异步与多线程异同点

  1. 异步和多线程都可以达到避免调用线程阻塞的目的
  2. 异步操作在完成await操作后,会发出完成通知,并释放占用的线程,之后系统调用线程池中空余的线程来进行await之后的操作,减少了线程负担。
  3. 而多线程编程会在整个任务中一直占用线程造成资源浪费。比如DMA(直接存储器访问)操作,允许硬件可以不通过CPU而直接与内存数据进行交互,在这时闲置的线程无法被释放,造成了资源浪费。(使用异步可以避免)

二、委托启动异步调用

下面我们可以通过一个示例看一下,分别执行5次

1.同步方法

同步方法
在这里插入图片描述

2.异步方法

异步方法
在这里插入图片描述

当我们调用同步方法时,程序是按照顺序执行,而下面的异步方法则是无序的,且执行速度也比较快。
在这里插入图片描述

三、多线程的特点

由上我们也可以看出同步和异步多线程方法的特点

  1. 同步方法卡界面,主(UI)线程忙于计算;
  2. 同步线程慢,因为只有一个线程在干活;
  3. 异步多线程方法不卡界面,主线程计算完,计算任务就交给子线程在做;例如winform可以提升用户体验;
  4. 异步多线程方法快,因为多个线程并发运算;
  5. 异步多线程无序:启动无序,执行时间不确定,结束也无序。
  6. 异步多线程并不是线性增长,而是资源换时间,但资源可能不够,其次多线程也有管理成本;
  7. 线程可以加快速度,但不是越多越好

下图可以清楚看到资源换时间的情况;
在这里插入图片描述

四、异步的回调和状态参数

1.顺序控制

从上面的示例中我们使用了异步多线程方式解决了很多问题,但也发现了一个特殊情况,异步是无序的,这时候我们如果想要控制顺序要怎么做呢。这个时候我们就可以使用回调的方式。
首先我们想在计算完成后,在完成后续动作,当我们在BeginInvoke中设置后续两个参数为null,可以看到下图的执行结果,我们的计算明明还没有完成,确提示我们已经完成了,只是主线程完成了。肯定不符合我们的结果。
在这里插入图片描述
在这里插入图片描述
这时候我们把鼠标放到BeginInvoke上可以发现框架已经帮我们提供好了异步回调AsyncCallback
在这里插入图片描述
我们可以看到AysncCallback是一个参数为IAsyncResult类型的委托
在这里插入图片描述
接下来我们修改代码把AsyncCallback传进来
在这里插入图片描述
这时我们再看执行结果,就可以看到我们结果实在最后输出的。
在这里插入图片描述
进行到这里你会想知道这是为什么呢,这个步骤是怎么完成的,callback的参数ia是怎么回事?
在这里插入图片描述
当我们继续把鼠标方法BeginInvake上,我们会发现它其实是一个IAsyncResult类型
在这里插入图片描述
你会发现这不是和上面AsyncCallback的参数ia是一样的吗,接下来我们做个验证

在这里插入图片描述
结果返回True

在这里插入图片描述
这时我们可以理解为,.net框架帮我们做了一个小封装,在执行BeginInvoke的时候会去申请一个线程,线程会先完成委托的调用,执行完成后会产生一个IAsyncResult结果,最后把这个结果作为参数传递给AsyncCallback委托,这也就能解释为什么BeginInvoke结果类型和AsyncCallback的参数类型是一致的。

2.状态参数

接下来我们看BeginInvoke的第三个参数,这时我们随便传入一个“hao”字符串。那么在AsyncState时我们就可以得到,这是为了我们在回调的时候如果想传递某些信息时使用。
在这里插入图片描述

五、异步等待三种方式

1. Thread.sleep等待

这种情况我们可以使用asyncResult.IsCompleted来进行判断委托是否执行完成。在执行完成之后给用户指定提示信息,如下为文件上传操作的示例
在这里插入图片描述
在这里插入图片描述

但是这么写是由弊端的就是会有延迟,也会卡主界面。优点就是我们可以在等待的时候做一些其它操作,例如给用户一些友好提示等。

2.asyncResult.AsyncWaitHandle.WaitOne()

信号量,即时等待

Console.WriteLine("Do Something Else.....");
Console.WriteLine("Do Something Else.....");
Console.WriteLine("Do Something Else.....");
asyncResult.AsyncWaitHandle.WaitOne();//等待任务的完成

也可以给asyncResult.AsyncWaitHandle.WaitOne(1000);设置等待时间做超时用,也叫做限时等待。

3.action.EndInvoke()

action.EndInvoke(asyncResult);
EndInvoke可以不仅等待也可以获取返回值,接下来介绍怎么获取返回值。

六、异步返回值

上述我们使用EndInvoke可以不仅等待也可以获取返回值;如下我们可以看到结果正是我们设置的字符串
在这里插入图片描述
在这里插入图片描述
EndInvoke也可以写在回调函数里面,方便我们获取其结果值,但只能写一次,写在里面就不可以写在外面了。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

开学季,护眼灯什么牌子好?2023年护眼台灯推荐

2023年开始了,时间飞逝,而每个父母都越来越紧张自家娃的学业情况,我国近视人数超过7亿人,而儿童时期是视力发育的关键时期,为啥有那么高的近视率呢?主要是用眼过度,以及用眼习惯,而现…

微信小程序——模板与配置,数据绑定,事件绑定

一.数据绑定1.数据绑定的基本原则在data中定义数据在WXML中使用数据2.在data中定义页面的数据在页面对应的.js文件中,把数据定义到data对象中即可3. Mustache 语法的格式把 data 中的数据绑定到页面中渲染,使用 Mustache 语法(双大括号&#…

想提高办公效率?可试试java开源工作流框架

在数据化管理越来越规范的当今社会,采用优质的办公软件平台能提高企业的办公协作效率,因而受到了广泛的欢迎和喜爱。那么,什么是java开源工作流框架?我们可以从它的特点、发展前景等方面来加以了解,一起来了解这一产品…

微信公众号运营工具有哪些?赶紧收藏

再厉害的公众号运营大神背后都有一套宝藏工具大全,辅助运营人一路披荆斩棘,堪称神器! 我相信网上一搜也能出来很多的运营工具或是网站,但是这里再来给大家来一个大汇总,这次整理绝对是非常详细和实用的,纯…

Fiddler中常用的功能

Fiddler中常用的功能如下: 停止抓包-清空会话窗-内容过滤请求-解码-设置断点 一、 停止抓包 二、清空会话窗 方法一,工具栏工具: 方法二,命令行形式: 当然,命令行工具也还支持其他命令的输入&#xff0c…

word排版技巧:如何将段中文字生成标题目录

在许多Word文档里面,目录页是非常重要的一页内容,因为目录页展示的是当前文档的内容框型和结构。通过目录页,我们能知道这个文档主要分为哪几部分。就像看书一样,起到了检索的作用。今天,我们就来给大家分享一个偏门的…

焕新古文化传承之路,AI为古彝文识别赋能

目录1 古彝文与古典保护2 古文识别的挑战2.1 西文与汉文OCR2.2 古彝文识别难点3 合合信息:古彝文保护新思路3.1 图像矫正3.2 图像增强3.3 语义理解3.4 工程技巧4 总结1 古彝文与古典保护 彝文指的是云南、贵州、四川等地的彝族人使用的文字,区别于现代意…

【Linux】常用基本指令(续)

文章目录🎪 Linux下基本指令1.1 🚀 whoami1.2 🚀 tree1.3 🚀 echo(浅析)1.4 🚀 zip/unzip1.5 🚀 tar1.6 🚀 bc1.7 🚀 history1.8 🚀 uname1.9 🚀 nano1.10 &a…

数据结构基础之动态顺序表详解

文章目录前言一、动态顺序表的概念二、顺序表的结构体三、基本接口1.SeqListInit(初始化数组)2.SeqListDestory(销毁数组)3. SeqListCheckCapacity(检查改顺序表是否需要扩容)4.SeqListPushBack&#xff08…

用真实业务场景告诉你,高并发下如何设计数据库架构?

目录: 用一个创业公司的发展作为背景引入用多台服务器来分库支撑高并发读写大量分表来保证海量数据下查询性能读写分离来支撑按需扩容及性能提升高并发下的数据库架构设计总结 这篇文章,我们来聊一下对于一个支撑日活百万用户的高并系统,他…

如何搭建云进销存-销售管理系统?

1、简介1.1、案例简介本文将介绍,如何搭建云进销存-销售管理。1.2、应用场景云进销存-销售管理应用支持移动端扫码录入,提高开单效率,保证开单质量。支持自定义优先级自动取价,灵活满足不同商品价格管理。2、设置方法2.1、表单搭建…

马蹄集 大小写的转换

大小写的转换 难度&#xff1a;青铜 0时间限制&#xff1a;1秒 巴占用内存&#xff1a;64M 请编写一个简单程序&#xff0c;实现输入字符大小写的转换。其他非法输入&#xff08;非 字母的输入)则原样输出。 #include <bits/stdc.h> using namespace std; int main() { …

1700页!卷S人的 Java《八股文》PDF手册

2022已成为过去式&#xff0c;不论这一年好与坏&#xff0c;我们都需要抓住新一年的机会&#xff0c;不论是跳槽涨薪&#xff0c;还是学习提升&#xff01;先给自己定一个小目标&#xff0c;然后再朝着目标去努力就完事儿了&#xff01; 为了帮大家节约时间&#xff0c;给大家搞…

Java关键字synchronized

提纲 定义 synchronized是同步块&#xff0c;实现了多线程间的互斥同步。它修饰的代码&#xff0c;确保任一时刻只有一个线程进入访问。 特性 因为在synchronized同步块内&#xff0c;只有一个线程能访问&#xff0c;因此确保了同步块内的原子性、可见性和有序性。 使用方式 总…

SpringBoot 统⼀功能处理 AOP

接下来是 Spring Boot 统⼀功能处理模块了&#xff0c;也是 AOP 的实战环节&#xff0c;要实现的⽬标有以下 3 个&#xff1a; 统⼀⽤户登录权限验证&#xff1b;统⼀数据格式返回&#xff1b;统⼀异常处理。 1.⽤户登录权限效验 ⽤户登录权限的发展从之前每个⽅法中⾃⼰验…

day35【代码随想录】贪心算法之加油站、分发糖果、柠檬水找零

文章目录前言一、加油站&#xff08;力扣134&#xff09;方法一方法二二、分发糖果&#xff08;力扣135&#xff09;三、柠檬水找零&#xff08;力扣860&#xff09;前言 1、加油站 2、分发糖果 3、柠檬水找零 一、加油站&#xff08;力扣134&#xff09; 在一条环路上有 n 个…

好文推荐!LLM技术精要;美图发全员激励股✦票;百度/微信大会精华笔记;Flink商✦业化再起波澜;GitHub今日热榜 | ShowMeAI资讯日报

&#x1f440;日报合辑 | &#x1f3a1;AI应用与工具大全 | &#x1f514;公众号资料下载 | &#x1f369;韩信子 &#x1f3a1; 『通向 AGI 之路』大型语言模型&#xff08;LLM&#xff09;技术精要 实话实说&#xff0c;国内在 LLM 模型相关技术方面&#xff0c;此刻距离最先…

【Linux】基础开发工具使用 --- gcc

目录 预处理 编译 汇编 链接 函数库 协助记忆 &#x1f9cb;GCC&#xff08;GNU Compiler Collection&#xff09;是由GNU开发的编程语言编译器。GNU编译器套件包括C、C、 Objective-C、 Fortran、Java、Ada和Go语言前端&#xff0c;也包括了这些语言的库&#xff08;如l…

Docker tarsgo

目录 参考&#xff1a; mysql镜像安装 一、安装镜像 二、创建mysql容器 使用 tarscloud/framework 部署框架 拉取最新版本镜像 启动镜像(目前只考虑了 linux 上, 时间和本机同步) 目录说明 参数解释 Docker 部署 Tars 应用节点 开发环境 docker-compose go安装 ubu…

CSS自定义滚动条

大家好&#xff0c;我是半夏&#x1f474;&#xff0c;一个刚刚开始写文的沙雕程序员.如果喜欢我的文章&#xff0c;可以关注➕ 点赞 &#x1f44d;&#xff5e; 搞前端的半夏 一起学习交流前端&#xff0c;成为更优秀的前端工程师 前言 之前写过一篇scroll-snap让你的滚动条更…