c# 学习笔记 - 异步编程

文章目录

    • 1. 异步编程介绍
      • 1.1 简单介绍
      • 1.2 async/await 使用
      • 1.3 Task/Task<TResult> 对象
    • 2. 样例
      • 2.1 迅速启动所有任务,仅当需要结果才等待任务执行
      • 2.2 使用 await 调用异步方法,即使这个异步方法内有 await 也不会同时执行回调和向下执行操作(必须完成外层await 所规定的方法)
    • 3. 补充拓展说明
      • 3.1 Task关键字

1. 异步编程介绍

1.1 简单介绍

  异步编程官方参考文档:异步编程

1.2 async/await 使用

  细节注意

  1. async 用来修饰方法,表示这个方法可以成为一个异步方法,但是如果内部没有搭配使用 await 关键字的话其作用还是等效于一个同步方法
  2. await 关键字必须用于在 async 修饰的异步方法内使用,await 的作用就是立即返回调用方法的结果,外部调用该 async 方法的地方将不会等待这个 await 关键字修饰 方法/其他延时 操作的完成。但这个async 异步方法内,下面的操作还是必须要等待这个 await 关键字修饰 方法/其他延时 操作的完成.
class Program {static void Main(string[] args) {Console.WriteLine("This is methof(Main) starting ...");Test();Console.WriteLine("This is methof(Main) ending ...");Console.ReadLine();}static async void Test() {Console.WriteLine("This is methof(Test) starting ...");// 立即返回Test函数运行结果,继续Main函数运行. 并且同时将会进行延时操作后再继续下面的方法.await Task.Delay(3000); Console.WriteLine("This is methof(Test) ending ...");}}
/*
This is methof(Main) starting ...
This is methof(Test) starting ...
// await Task.Delay(3000); 返回主线程运行 + 当前Test()方法此位置暂停运行3s
This is methof(Main) ending ... 
This is methof(Test) ending ...
*/

1.3 Task/Task 对象

  简单说明

  1. 使用Task或Task对象来保存正在运行的任务, 可以使用这个对象来保存一个正在运行的任务.
class Program {static void Main(string[] args) {Task<int> task = Task.Run(() => {Console.WriteLine("Hello world ..");return 2024;});int sum = task.Result;Console.WriteLine(sum);}
}
/*
Hello world ..
2024
*/

2. 样例

2.1 迅速启动所有任务,仅当需要结果才等待任务执行

假设我们需要完成打游戏 5s,我们也需要完成听歌曲 5s,最后我们需要去洗个澡 3s. 我们想要异步完成打游戏和听歌曲的操作,但是洗澡必须先完成打游戏和听歌曲两个步骤.
  您可以立即启动所有异步任务。仅当您需要结果时才等待每个任务,借助 await 关键字,await 关键字将会阻塞异步操作的执行,必须等待所有前缀步骤完成后,再完成接下来的步骤

class Program {static void Main(string[] args) {Test();Console.WriteLine("This is Main Finish  .....");Console.ReadLine();}static async void Test() {Task t1 = playGameAsync();Task t2 = listenMusicAsync();await t1;await t2; // await 关键字表示必须等待这两个方法完成才能继续接下来的洗澡操作Console.WriteLine("i am washing right now ...");}static async Task playGameAsync() {await Task.Run(() => {Console.WriteLine("I am play game ..");Task.Delay(5000).Wait();});Console.WriteLine("i am finish play game");}static async Task listenMusicAsync() {await Task.Run(() => {Console.WriteLine("I am listen music ..");Task.Delay(5000).Wait();});Console.WriteLine("i am finish listen music");}
}
/*
I am play game ..
I am listen music ..
This is Main Finish  ..... // 这个地方的原因
(这个地方将会明显等待 5s, 洗澡操作必须等待听音乐和游戏操作先完成)
i am finish play game
i am finish listen music
i am washing right now ...
*/

2.2 使用 await 调用异步方法,即使这个异步方法内有 await 也不会同时执行回调和向下执行操作(必须完成外层await 所规定的方法)

class Program {static void Main(string[] args) {Test(); // 同步方法调用异步方法,碰到了异步方法内的 await( await playGameAsync() ) 就会回调执行Console.WriteLine("This is Main Finish  .....");Console.ReadLine();}static async void Test() {await playGameAsync(); // 这里不会因为 playGameAsync() 方法内有await就回调执行, 必须等待异步方法playGameAsync()执行完全.Console.WriteLine("==========================================================");Console.WriteLine("i am washing right now ...");}static async Task playGameAsync() {await Task.Run(() => {Task.Delay(3000).Wait();Console.WriteLine("I am play game ..");});Task.Delay(3000).Wait();Console.WriteLine("i am finish play game");}}
/*
This is Main Finish  .....(等待3s)
I am play game ..
i am finish play game  (明显发现 finish play game 的输出顺序会优先于 ====== )
==========================================================
i am washing right now ...
*/

3. 补充拓展说明

3.1 Task关键字

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

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

相关文章

Kali在Vmware无法连接到网络,配置网络及解决办法

一.问题描述&#xff1a; 打开 Kali&#xff0c;无法连接到网络&#xff0c;虚拟机配置正常的。 尝试 ping 百度&#xff0c;出错&#xff1a; ping baidu.com 提示&#xff1a; ping: baidu.com: Temporary failure in name resolution二.解决办法&#xff1a; 1.首先在vmwa…

工作流功能

在小程序、公众号的开发过程中&#xff0c;开发者经常遇到以下场景&#xff1a; 接收来自微信的服务端回调消息&#xff0c;例如公众号事件推送、微信支付付款回调等&#xff1b;运行定时任务&#xff0c;例如每天 0 点进行数据清理、统计等&#xff1b;进行任务逻辑编排&…

手机常用的root方案

手机常用的root方案 xposed Magisk KernelSU SuperSU 这些都是用于手机Root的工具或框架&#xff0c;它们之间有一些区别&#xff1a; Xposed Framework&#xff1a;Xposed是一个适用于Android设备的框架&#xff0c;允许用户在不修改APK文件的情况下对系统进行定制。它通…

Base64编码原理解析

文章目录 一、Base64Base64编码的原理如下&#xff1a;以字符串"hello world"为例&#xff0c;它的ASCII码为&#xff08;下面&#x1f447;是ASCII码对照表&#xff09;&#xff1a;将这些ASCII码转换为二进制&#xff08;对照上表&#xff09;&#xff1a;将上述二…

Flink的KeyedProcessFunction基于Event Time和Process Time的定时器用法实例分析

FLink处理函数简介 在Flink底层&#xff0c;我们可以不定义任何具体的算子&#xff08;比如 map&#xff0c;filter&#xff0c;或者 window&#xff09;&#xff0c;而只是提炼出一个统一的【处理】&#xff08;process&#xff09;操作——它是所有转换算子的一个概括性的表…

一键式Excel分词统计工具:如何轻松打包Python脚本为EXE

一键式Excel分词统计工具&#xff1a;如何轻松打包Python脚本为EXE 写在最前面需求分析直接用Python打包为什么大&#xff1f;为什么要使用conda环境&#xff1f; 将Python脚本打包为一个独立的应用程序1. 编写Python脚本&#xff1a;初步功能实现2. 初步图形用户界面&#xff…

Spark基础学习--基础介绍

1. Spark基本介绍 1.1 定义 Spark是可以处理大规模数据的统一分布式计算引擎。 1.2 Spark与MapReduce的对比 在之前我们学习过MapReduce&#xff0c;同样作为大数据分布式计算引擎&#xff0c;究竟这两者有什么区别呢&#xff1f; 首先我们回顾一下MapReduce的架构&#xf…

字符串排序 sort(str.begin(),str.end(),greater<>())

给定一个整数 n&#xff0c;你可以将其中的数字以任意顺序重新排列&#xff0c;组成新的数字&#xff08;也可以不重排&#xff0c;保留原数字&#xff09;。 请问能否组合出 30 的倍数&#xff0c;如果可以&#xff0c;则输出满足条件的最大值&#xff0c;否则输出 −1。 例如…

CC工具箱使用指南:【三调名称转用地用海名称】

一、简介 三调地类和用地用海地类之间有点相似但并不一致。 在做规划时&#xff0c;拿到的三调&#xff0c;都需要将三调地类转换为用地用海地类&#xff0c;然后才能做后续的工作。 一般情况下&#xff0c;三调转用地用海存在【一对一&#xff0c;多对一和一对多】3种情况。…

JWT渗透姿势一篇通

文章前言 企业内部产品应用使用JWT作为用户的身份认证方式&#xff0c;在对应用评估时发现了新的关于JWT的会话安全带来的安全问题&#xff0c;后期再整理时又加入了之前遗留的部分JWT安全问题&#xff0c;至此汇总成一篇完整的JWT文章 简单介绍 JWT(JSON Web Token)是一种用…

直播间的秒杀狂热背后,猫眼电影如何接住10w+并发运营活动?

“倒数&#xff0c;5、4、3、2、1” “10万张&#xff01;” “20秒没了” 上周末&#xff0c;张家辉和导演马浴柯带着新电影《怒潮》上了疯狂小杨哥的直播间&#xff0c;人数一度冲破80万人。 这次直播&#xff0c;是猫眼电影为新电影《怒潮》准备的一次宣传活动。 随着小…

《设计模式的艺术》笔记 - 享元模式

介绍 享元模式运用共享技术有效地支持大量细粒度对象的复用。系统只使用少量的对象&#xff0c;而这些对象都很相似&#xff0c;状态变化很小&#xff0c;可以实现对象的多次复用。由于享元模式要求能够共享的对象必须是细粒度对象&#xff0c;因此它又称为轻量级模式&#xff…

洛谷P1161 开灯

这倒也是水题&#xff0c;我们可以建立一个数组&#xff0c;数组的下标就是编号&#xff0c;我们要注意的是浮点数乘法的结果要转化成整数&#xff0c;才能当做下标&#xff0c;因为题目给的是整数编号。 # include <stdio.h> int main() {int a[1000000] { 0 }, n, t,…

【linux】linux系统安装与更新软件

前言 linux系统安装软件有许多的方式&#xff0c;本文列举的是类似于windows从应用商店安装软件的方法。也是最常用最省事的方法。 但是呢linux系统是有许多发行版本的&#xff0c;不同版本的命令不同&#xff0c;但语法基本是一模一样。 概念插入 windows系统中&#xff0c…

IPv6自动隧道---6to4隧道

IPv6 over IPv4自动隧道特点 由于IPv4兼容IPv6隧道要求每一个主机都要有一个合法的IP地址,而且通讯的主机要支持双栈、支持IPv4兼容IPv6隧道,不适合大面积部署。目前该技术已经被6to4隧道所代替。 6to4隧道 集手动隧道和自动隧道的优点于一身,提出6to4的目的是为IPv4网络…

Linux如何创建文件

使用touch命令&#xff1a;使用touch命令可以创建一个新文件&#xff0c;如果文件已经存在&#xff0c;则只更新其访问时间和修改时间。例如&#xff0c;要创建一个名为test.txt的文件&#xff0c;请在终端中输入以下命令&#xff1a; touch test.txt使用echo命令&#xff1a;使…

【Spring源码分析】从源码角度去熟悉依赖注入(一)

从源码角度去熟悉依赖注入 一、全局出发引出各种依赖注入策略二、Autowired依赖注入源码分析属性注入源码分析&#xff08;AutowiredFieldElement.inject&#xff09;方法注入源码分析&#xff08;AutowiredMethodElement.inject&#xff09;流程图 其实在上篇阐述非懒加载单例…

UE5 独立程序的网络TCP/UDP服务器与客户端基础流程

引擎源码版&#xff0c;复制\Engine\Source\Programs\路径下的BlankProgram空项目示例。 重命名BlankProgram&#xff0c;例如CustomTcpProgram&#xff0c;并修改项目名称。 修改.Build.cs内容 修改Target.cs内容 修改Private文件夹内.h.cpp文件名并修改.cpp内容 刷新引擎 …

模拟StopWatch改写的一款耗时调试工具

StopWatch在单个文件的单个方法中确时还蛮好用的&#xff0c;但跨多个文件&#xff0c;多个方法的同一线程内调试就有明显的不舒服。一是要建立ThreadLocal共享StopWatch的实例。二是StopWatch的start和stop必须形成闭合。在方法嵌套的场景。比如要查看大方法执行时间&#xff…

性能测试中的基准测试

在性能测试中有一种测试类型叫做基准测试。这篇文章&#xff0c;就聊聊关于基准测试的一些事儿。 1、定义 通过设计合理的测试方法&#xff0c;选用合适的测试工具和被测系统&#xff0c;实现对某个特定目标场景的某项性能指标进行定量的和可对比的测试。 2、特质 ①、可重…