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

C#学习系列相关之多线程(四)----async和await的用法

一、async、await用法的作用

        async用法主要是用来作为修饰符将方法作为异步方法使用,await关键字只用作为在异步方法才能使用,也就是只有当方法有async修饰后,才能在方法中使用await,await后跟Task新的任务启动。(await和async是配对使用)

二、async、await用法实例 

第一个关键点:

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();for (int i = 0; i < 400; i++){Console.Write(0);}Console.Read();}public async static void test(){for (int i = 0; i < 300; i++){Console.Write(1);}await Task.Run(() =>{for (int i = 0; i < 300; i++){Console.Write(2);}});for (int i = 0; i < 300; i++){Console.Write(3);}}}
}

 

        await的核心作用:如上述代码当中,我们在test函数中使用Task.Run开启新线程后,主线程和支线程交替执行,也就是输出结果为1,然后2和3交替输出,最后输出0,只是在函数内部开启支线程,并没有跳出函数。

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();for (int i = 0; i < 1000; i++){Console.Write(0);}Console.WriteLine("0的支线程号为" + Thread.CurrentThread.ManagedThreadId);Console.Read();}public async static void test(){for (int i = 0; i < 300; i++){Console.Write(1);}Console.WriteLine("1的支线程号为" + Thread.CurrentThread.ManagedThreadId);Task.Run(() =>{for (int i = 0; i < 300; i++){Console.Write(2);}Console.WriteLine("2的支线程号为" + Thread.CurrentThread.ManagedThreadId);});for (int i = 0; i < 300; i++){Console.Write(3);  }Console.WriteLine("3的支线程号为" + Thread.CurrentThread.ManagedThreadId);}}
}

运行结果为:

在添加await后,当输出2的时候,会跳出test函数,2和0交替输出,等待Task.run运行完,再继续执行函数后的内容,输出结果也就是1,2和0交替输出,最后再输出3,如果0的数量比较多,则0和3也会交替输出!

总结:test中的代码在await以前的代码都是在主函数的线程中输出,但是在await以后的代码会在Task.Run的线程中运行。

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();for (int i = 0; i < 1000; i++){Console.Write(0);}Console.WriteLine("0的支线程号为" + Thread.CurrentThread.ManagedThreadId);Console.Read();}public async static void test(){for (int i = 0; i < 300; i++){Console.Write(1);}Console.WriteLine("1的支线程号为" + Thread.CurrentThread.ManagedThreadId);await Task.Run(() =>{for (int i = 0; i < 300; i++){Console.Write(2);}Console.WriteLine("2的支线程号为" + Thread.CurrentThread.ManagedThreadId);});for (int i = 0; i < 300; i++){Console.Write(3);  }Console.WriteLine("3的支线程号为" + Thread.CurrentThread.ManagedThreadId);}}
}

运行结果如图:

 

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

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

第二个关键点:

await会返回一个结果,返回的结果类型是Task<resut>类型,当我们主函数需要该结果的result的时候,我们的代码会等待函数全部完成后才会继续执行。 

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){var tt=test();for (int i = 0; i < 1000; i++){Console.Write(0);}Console.WriteLine("0的支线程号为" + Thread.CurrentThread.ManagedThreadId);Console.WriteLine(tt.Result);for (int i = 0; i < 1000; i++){Console.Write(8);}Console.Read();}public async static Task<int> test(){for (int i = 0; i < 300; i++){Console.Write(1);}Console.WriteLine("1的支线程号为" + Thread.CurrentThread.ManagedThreadId);var result =await Task<int>.Run(() =>{for (int i = 0; i < 300; i++){Console.Write(2);}Console.WriteLine("2的支线程号为" + Thread.CurrentThread.ManagedThreadId);return 10;});for (int i = 0; i < 300; i++){Console.Write(3);  }Console.WriteLine("3的支线程号为" + Thread.CurrentThread.ManagedThreadId);return result;}}
}

上述代码中当主函数中需要tt.result时,主函数代码会等待test函数运行完返回result结果后再继续执行后续代码。

运行结果为:

提示:async修饰的函数类型只有三种,void类型、Task和Task<T>!!!

Task.Run的单独返回类型为内部运行函数的返回值T,但await修饰后的返回值为Task<T>

参考文献:

C# async / await 用法_c# await_熊思宇的博客-CSDN博客 

相关文章:

C#学习系列相关之多线程(四)----async和await的用法

一、async、await用法的作用 async用法主要是用来作为修饰符将方法作为异步方法使用&#xff0c;await关键字只用作为在异步方法才能使用&#xff0c;也就是只有当方法有async修饰后&#xff0c;才能在方法中使用await&#xff0c;await后跟Task新的任务启动。&#xff08;awai…...

极智AI | 大模型优化之KV Cache

欢迎关注我的公众号 [极智视界],获取我的更多经验分享 大家好,我是极智视界,本文来介绍一下 大模型优化之KV Cache。 邀您加入我的知识星球「极智视界」,星球内有超多好玩的项目实战源码下载,链接:https://t.zsxq.com/0aiNxERDq 在大模型的优化中经常会听到的一个技术叫…...

Android 使用 registerForActivityResult() 打开系统相册或相机获取图像

一、简介 当使用了 AndroidX 后&#xff0c;发现 startActivityForResult() 标记为过时了&#xff0c;而是推荐我们使用 registerForActivityResult() 函数。 registerForActivityResult() 函数是 Android 中用于启动 Activity 结果回调的新方式。这个函数的目的是简化在 Act…...

如何制作网页 ico

1. 制作 icon 可以通过 https://www.iconfont.cn/collections/detail?spma313x.7781069.1998910419.de12df413&cid13720 或者自己在 PPT 制作&#xff0c;然后截图导出png 文件。 2. 转换为 ico 文件 使用&#xff1a;https://www.bitbug.net/ 上传并且转换成自己要的…...

golang gorm 增删改查以及使用原生SQL(以操作mysql为例)

gorm mysql增删改查 model定义 package _caseimport "gorm.io/gorm"func init() {DB.Migrator().AutoMigrate(Teacher{}, Course{}) } type Roles []stringtype Teacher struct {gorm.ModelName string gorm:"size:256"Email string gorm:&q…...

代码随想录 单调栈part2

503. 下一个更大元素 II 给定一个循环数组 nums &#xff08; nums[nums.length - 1] 的下一个元素是 nums[0] &#xff09;&#xff0c;返回 nums 中每个元素的 下一个更大元素 。 数字 x 的 下一个更大的元素 是按数组遍历顺序&#xff0c;这个数字之后的第一个比它更大的数…...

详解利用高斯混合模型拆解多模态分布 + 精美可视化

文章目录 一、前言二、主要内容三、总结🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 一、前言 本文旨在介绍如何利用高斯混合模型(Gaussian Mixture Models,简称 GMMs)将一维多模态分布拆分为多个分布。作为统计 / / /机器学习领域常用的概率模型...

排序算法之【归并排序】

&#x1f4d9;作者简介&#xff1a; 清水加冰&#xff0c;目前大二在读&#xff0c;正在学习C/C、Python、操作系统、数据库等。 &#x1f4d8;相关专栏&#xff1a;C语言初阶、C语言进阶、C语言刷题训练营、数据结构刷题训练营、有感兴趣的可以看一看。 欢迎点赞 &#x1f44d…...

Qt中QTimer定时器的用法

Qt中提供了两种定时器的方式一种是使用Qt中的事件处理函数&#xff0c;另一种就是Qt中的定时器类QTimer。 使用QTimer类&#xff0c;需要创建一个QTimer类对象&#xff0c;然后调用其start()方法开启定时器&#xff0c;此后QTimer对象就会周期性的发出timeout()信号。 1.QTimer…...

vue-组件定义注册使用

vue组件使用的步骤 定义组件注册组件使用组件 定义组件 Vue.extend(options) 其中options和new Vue(options)出入的options对象几乎一样&#xff0c;但是也有不同。 创建 el不用写—最终所有组件需要经过一个vm的管理&#xff0c;由vm的el决定服务哪个容器。 data必须写成函…...

斑馬打印機打印中文

创建项目 首先說一下&#xff0c;本文章是借鉴了其他大佬的文章&#xff0c;然后我记录一下的文章。 首先创建好一个.net framework的winform项目。 这里面主要用到两个库文件&#xff1a; Fnthex32.dll、LabelPrint.dll。 Fnthex32这个有8位参数和9位参数的&#xff0c;我这…...

(一)Apache log4net™ 手册 - 介绍

0、相关概念 Log4j 几乎每个大型应用程序都包含自己的日志记录或跟踪 API。根据这一规则&#xff0c;E.U. SEMPER &#x1f339;项目决定编写自己的跟踪 API。那是在 1996 年初。经过无数次的增强、几个化身和大量的工作&#xff0c;API 已经发展成为 log4j —— 一个流行的 Ja…...

基于Java的民宿管理系统设计与实现(源码+lw+部署文档+讲解等)(民宿预约、民宿预订、民宿管理、酒店预约通用)

文章目录 前言具体实现截图论文参考详细视频演示代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技…...

039:mapboxGL更换地图上的鼠标样式

第039个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中更换地图上的鼠标的样式。 直接复制下面的 vue+mapbox源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共74行)相关API参考:专栏目标示例效果 配置方式 1)查看基础设置:htt…...

【云原生】K8S对外服务之Ingress

目录 一、Ingress 简介1.1Ingress 组成1.3Ingress-Nginx 工作原理 二、部署 nginx-ingress-controller2.1部署ingress-controller Pod及相关资源2.2ingress 暴露服务的方式2.3 采用方式二&#xff1a;DaemonSetHostNetworknodeSelector 三、采用方式二&#xff1a;DeploymentNo…...

分布式锁如何实现

分布式是现在的比较主流的技术&#xff0c;常常和微服务一起出现。那么对于多个实例之间&#xff0c;如何证分布式系统中多个进程或线程同步访问共享资源呢&#xff1f;我们其实一想到的就是锁&#xff0c;我们在java里边有 synchronized, 在python里有lock&#xff0c;但是这个…...

Mysql存储-EAV模式

Mysql存储-EAV模式 最近又又又搞一点新东西&#xff0c;要整合不同业务进行存储和查询&#xff0c;一波学习过后总结了一下可扩展性MAX的eav模式存储。 在eav这里的数据结构设计尤为关键&#xff0c;需要充分考虑你需要使用的字段、使用场景&#xff0c;当数据结构设计完成后便…...

全局变量报错:\Output\STM32.axf: Error: L6218E: Undefined symbol

全局变量报错&#xff1a; .\Output\STM32.axf: Error: L6218E: Undefined symbol key_num (referred from main.o). 这里只说全局变量哦&#xff0c;这是因为你在调用的.c文件里 把定义写在了函数里面&#xff0c;写函数外面就没事了 改为&#xff1a; .h的声明文件根本不用写…...

算法错题簿(持续更新)

自用算法错题簿&#xff0c;按算法与数据结构分类 python1、二维矩阵&#xff1a;记忆化搜索dp2、图论&#xff1a;DFS3、回溯&#xff1a;129612964、二叉树&#xff1a;贪心算法5、字符串&#xff1a;记忆化搜索6、01字符串反转&#xff1a;结论题7、二进制数&#xff1a;逆向…...

基于Springboot实现疫情网课管理系统项目【项目源码+论文说明】

基于Springboot实现疫情网课管理系统演示 摘要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;对于疫情网课管理系统当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带动了疫情…...

Linux文件与目录的增删改查

一、增 1、mkdir命令 作用&#xff1a; 创建一个新目录。 格式&#xff1a; mkdir [选项] 要创建的目录 常用参数&#xff1a; -p&#xff1a;创建目录结构中指定的每一个目录&#xff0c;如果目录不存在则创建&#xff0c;如果目录已存在也不会被覆盖。 用法示例&a…...

JVM的内存模型

一、JVM的内存模型 1.1、目标 内存模型是用来描述JVM内部的内存结构和内存管理的模型。它定义了JVM在运行Java程序时所需要的各种内存区域&#xff0c;以及每个内存区域的作用和特点。 1.2、结构划分 1.2.1、栈 每个线程在执行Java方法时会创建一个栈帧&#xff08;Stack …...

数据采集项目之业务数据(三)

1. Maxwell框架 开发公司为Zendesk公司开源&#xff0c;用java编写的MySQL变更数据抓取软件。内部是通过监控MySQL的Binlog日志&#xff0c;并将变更数据以JSON格式发送到Kafka等流处理平台。 1.1 MySQL主从复制 主机每次变更数据都会生成对应的Binlog日志&#xff0c;从机可…...

vuedraggable影响点击事件的解决办法

在工作中有很多场景需要针对广告、商品、信息推广等进行一个排序,或者对展示的顺序做出调整,方便放用户第一眼看到自己感兴趣的信息,因此避免不了需要用到排序的插件,这里以vue为例子,采用的插件是vuedraggable,这个插件针对于排序的功能相对完善,官网地址:vuedraggable官网 但…...

Linux 中的 grep 命令

Linux 中的 grep 命令是一个强大的文本搜索工具&#xff0c;它允许用户在文件中查找指定的文本模式&#xff0c;并将匹配的行打印出来。grep 是“Global Regular Expression Print”的缩写&#xff0c;它使用正则表达式来进行文本搜索&#xff0c;因此具有强大的灵活性和功能。…...

阶段五-Day03-Ajax

一、JavaWeb中路径的说明 1. JavaWeb中的路径 在JavaWeb中, 路径分为相对路劲和绝对路径两种: 相对路径: ./ 表示当前目录 ../ 表示当前文件所在目录的上一级目录 绝对路径: 完整的路径名 2. 在JavaWeb中/的不同意义 /斜杠如果被浏览器解析,得到的是 协议本地ip端口号…...

EPOLL单线程版本 基于reactor 的 httpserver文件下载 支持多个客户端同时处理

之前写了一个httpserver的问价下载服务器 如果有多个客户端请求过来只能串行处理必须得等当前的操作完成之后才会处理 另外还存在 文件大的时候 会出错 处理不了 原因就是 sendfile是在一个while循环中处理的 当调用send失败返回-1之后 就 结束了 而一般来讲 se…...

uniapp实现微信小程序隐私协议组件封装

uniapp实现微信小程序隐私协议组件封装。 <template><view class"diygw-modal basic" v-if"showPrivacy" :class"showPrivacy?show:" style"z-index: 1000000"><view class"diygw-dialog diygw-dialog-modal bas…...

【Node.js】NPM 和 package.json

NPM npm 是 Node.js 的包管理工具&#xff0c;基于命令行&#xff0c;用于安装、升级、移除、管理依赖项。 常用命令&#xff1a; npm init&#xff1a;初始化一个新的 npm 项目&#xff0c;创建 package.json 文件。&#xff08;括号里为默认值&#xff09; description&am…...

周总结【java项目】

项目进度&#xff1a; 学习了JavaFX&#xff0c;下载了sceneBuilder辅助工具构建窗口&#xff08;目前建立了登陆&#xff0c;注册&#xff0c;忘记密码的界面&#xff09;&#xff0c;然后是学习了MySQL的连接&#xff0c;现在的项目是刚连上数据库&#xff1b; 下一步&…...