C# .Net学习笔记—— 异步和多线程(await/async)

一、介绍

1、控制台测试await/async

2、C# 5.0   .Net framework4.5  CLR4.0 以后才有,本身是一种语法糖

二、基本测试

1、不加await测试。

        private async static Task TestAsync() {Log.Info($"当前主线程id={Thread.CurrentThread.ManagedThreadId}");NoReturnNoAwait();for (int i = 0; i < 10; i++){Thread.Sleep(300);Log.Info($"Main Thread Task ManagedThreadID = {Thread.CurrentThread.ManagedThreadId}");}}private static async void NoReturnNoAwait() {Log.Info($"NoReturn Sleep before await,ThreadID={Thread.CurrentThread.ManagedThreadId}");TaskFactory taskFactory = new TaskFactory();Task task = taskFactory.StartNew(() =>{Log.Info($"NoReturn Sleep before,ThreadID={Thread.CurrentThread.ManagedThreadId}");Thread.Sleep(3000);Log.Info($"NoReturn Sleep after,ThreadID={Thread.CurrentThread.ManagedThreadId}");});Log.Info($"NoReturn Sleep after await,ThreadID={Thread.CurrentThread.ManagedThreadId}");}

2、加await测试。

        private async static Task TestAsync() {Log.Info($"当前主线程id={Thread.CurrentThread.ManagedThreadId}");NoReturn();//NoReturnNoAwait();for (int i = 0; i < 10; i++){Thread.Sleep(300);Log.Info($"Main Thread Task ManagedThreadID = {Thread.CurrentThread.ManagedThreadId}");}}private static async void NoReturn() {Log.Info($"NoReturn Sleep before await,ThreadID={Thread.CurrentThread.ManagedThreadId}");TaskFactory taskFactory = new TaskFactory();Task task = taskFactory.StartNew(() => {Log.Info($"NoReturn Sleep before,ThreadID={Thread.CurrentThread.ManagedThreadId}");Thread.Sleep(3000);Log.Info($"NoReturn Sleep after,ThreadID={Thread.CurrentThread.ManagedThreadId}");});await task;  //主线程到这里就返回了,执行主线程任务Log.Info($"NoReturn Sleep after await,ThreadID={Thread.CurrentThread.ManagedThreadId}");}

结果:从打印出来的两种执行顺序来看,加了await以后,主线程运行到await这行就会执行
回主线程任务。而await后面的代码将由主线程或其他线程来执行

原理:await后面的代码,会被封装成委托,在await task之后成为回调(编译器功能,状态机实现) ,这个回调的线程是不确定的,可能是主线程,可能是子线程也可能是其他线程。

它可以等价于task.ContinueWith(t=>{}) 这里包起来

  验证一下:

       private async void AwaitTest() {//方法一:NoReturn();//方法二:TaskFactory taskFactory = new TaskFactory();Task task = taskFactory.StartNew(() =>{Log.Info($"NoReturn Sleep before,ThreadID={Thread.CurrentThread.ManagedThreadId}");Thread.Sleep(3000);Log.Info($"NoReturn Sleep after,ThreadID={Thread.CurrentThread.ManagedThreadId}");});task.ContinueWith(t =>{callBack();});await task;}private static async void NoReturnNoAwait(){Log.Info($"NoReturn Sleep before await,ThreadID={Thread.CurrentThread.ManagedThreadId}");TaskFactory taskFactory = new TaskFactory();Task task = taskFactory.StartNew(() =>{Log.Info($"NoReturn Sleep before,ThreadID={Thread.CurrentThread.ManagedThreadId}");Thread.Sleep(3000);Log.Info($"NoReturn Sleep after,ThreadID={Thread.CurrentThread.ManagedThreadId}");});Log.Info($"NoReturn Sleep after await,ThreadID={Thread.CurrentThread.ManagedThreadId}");}private void callBack(){Log.Info($"我是一个回调。。");Log.Info($"NoReturn Sleep after await,ThreadID={Thread.CurrentThread.ManagedThreadId}");}

 三、返回值问题

1、不需要传值的时候,我们返回值就写成Task或者void都可以

2、需要传值的话 ,可以使用这种带泛型传值

四、小案例

       private void MainThread() {Log.Info("主线程Start");Async();Log.Info($"aaa {Thread.CurrentThread.ManagedThreadId.ToString("00")}");}private async void Async(){Log.Info($"ddd {Thread.CurrentThread.ManagedThreadId.ToString("00")}");await Task.Run(() =>{Thread.Sleep(500);Log.Info($"bbb {Thread.CurrentThread.ManagedThreadId.ToString("00")}");});Log.Info($"ccc {Thread.CurrentThread.ManagedThreadId.ToString("00")}");}

猜测执行顺序:

1、打印主线程Start

2、主线程进入Async方法,打印ddd

3、碰到了await,主线程返回回去执行,打印aaa

4、子线程等待500毫秒后,并行打印bbb

5、最后回调打印ccc

公布结果:

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

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

相关文章

STM32深入系列02——BootLoader分析与实现

文章目录 1. STM32程序升级方法1.1 ST-Link / J-link下载1.2 ISP&#xff08;In System Programing&#xff09;1.3 IAP&#xff08;In Applicating Programing&#xff09;1.3.1 正常程序运行流程1.3.2 有IAP时程序运行流程 2. STM32 Bootloader实现2.1 方式一&#xff1a;Boo…

掌握视频节奏,玩转剪辑艺术!,轻松调整视频播放速度与秒数的技巧大揭秘

你是否经常觉得视频播放得太快或太慢&#xff0c;无法满足你的观看需求&#xff1f;或者想要控制视频的长度&#xff0c;却不知道该如何下手&#xff1f;今天&#xff0c;我们将为你揭秘几种简单又实用的方法&#xff0c;让你轻松调整视频的播放速度和秒数&#xff01; 首先&a…

ROS2学习笔记一:安装及测试

目录 前言 1 ROS2安装与卸载 1.1 安装虚拟机 1.2 ROS2 humble安装 2 ROS2测试 2.1 topic测试 2.2 小海龟测试 2.3 RQT可视化 2.4 占用空间 前言 ROS2的前身是ROS&#xff0c;ROS即机器人操作系统&#xff08;Robot Operating System&#xff09;,ROS为了“提高机器人…

JS 函数

函数就是封装了一段可以被重复执行调用的代码块。目的&#xff1a;让大量代码重复利用 1、声明函数 方式一&#xff1a;利用函数关键字自定义函数&#xff08;命名函数&#xff09; function 函数名&#xff08;&#xff09;{//函数体代码} function是声明函数的关键字&#…

企业的 Android 移动设备管理 (MDM) 解决方案

移动设备管理可帮助您在不影响最终用户体验的情况下&#xff0c;通过无线方式管理和保护组织的移动设备群&#xff0c;现代 MDM 解决方案还可以控制 App、内容和安全性&#xff0c;因此员工可以毫无顾虑地在托管设备上工作。移动设备管理软件可有效管理个人设备上的公司空间。M…

基于模块自定义扩展字段的后端逻辑实现(二)

目录 一&#xff1a;创建表 二&#xff1a;代码逻辑 上一节我们详细讲解了自定义扩展字段的逻辑实现和表的设计&#xff0c;这一节我们以一个具体例子演示下&#xff0c;如何实现一个订单模块的自定义扩展数据。 一&#xff1a;创建表 订单主表: CREATE TABLE t_order ( …

【赠书第16期】码上行动:用ChatGPT学会Python编程

文章目录 前言 1 ChatGPT简介 2 Python编程简介 3 使用ChatGPT学习Python编程 4 如何使用ChatGPT学习Python编程 5 推荐图书 6 粉丝福利 前言 随着人工智能技术的不断发展&#xff0c;聊天机器人已经成为我们日常生活和工作中不可或缺的一部分。其中&#xff0c;ChatGP…

重磅!GPT Store正式上线!

GPT Store来了。根据公告&#xff0c;用户可以在ChatGPT Plus、Team和Enterprise中访问、分享和销售使用OpenAI技术创建的AI模型。 而且&#xff0c;GPT Store确实有“推荐”机制&#xff1a;“特色GPTs”&#xff0c;商店会每周更新一批官方推荐的GPTs。另外OpenAI提供了“举报…

Unity中URP下实现能量罩(外发光)

文章目录 前言一、实现菲涅尔效果1、求 N ⃗ \vec{N} N 2、求 V ⃗ \vec{V} V 3、得出菲涅尔效果4、得出菲涅尔相反效果5、增加菲涅尔颜色 二、能量罩 交接处高亮 和 外发光效果结合1、修改混合模式&#xff0c;使能量罩透明2、限制 0 ≤ H i g h L i g h t C o l o r ≤ 1 …

韵达快递物流查询,批量复制查询好的快递物流信息

在网购成为日常的今天&#xff0c;每一条快递物流信息都牵动着我们的心。如何快速、准确地掌握这些信息&#xff0c;成为了一个迫切的需求。今天&#xff0c;就让我为大家介绍一款神奇的软件——快递批量查询高手&#xff0c;助你轻松查获和管理快递物流信息。 所需工具&#…

C语言理解

目录 计算机语言算法C项目创建C程序框架经典实例 计算机语言 程序是用特殊的编程语言&#xff08;这里是C语言&#xff09;写出来表达如何解决问题的不是用编程语言来和计算机交谈&#xff0c;而是描述要求它如何做事情的过程或方法程序是问题的载体&#xff0c;程序的执行就是…

羊奶加红枣,女性必备的加法!

羊奶加红枣&#xff0c;女性必备的加法&#xff01; 在当今社会&#xff0c;女性健康备受关注。而羊奶和红枣作为常见的食材&#xff0c;以其独特的营养价值备受追捧。不少人认为&#xff0c;羊奶里面加红枣对女生有很大的帮助。那么&#xff0c;到底羊奶加红枣对女性健康有哪…

GitHub pull request(傻瓜式入门版)

基础入门版 pull request一、fork项目二、clone代码到本地三、进入到克隆的项目目录下四、列出所有分支五、创建一个本地分支&#xff0c;并追踪远程项目分支六、查看当前分支七、与远程仓库建立连接八、与上游仓库建立连接八、同步最新代码九、修改代码并提交十、提交pr pull …

推荐几本学习Python的书籍

我推荐的学习Python的书籍 入门读物 《Python基础教程》&#xff08;Beginning Python From Novice to Professional&#xff09;《Python学习手册》&#xff08;Learning Python&#xff09;《Python编程》&#xff08;Programming Python&#xff09;《Python Cookbook》《…

苍穹外卖Day01——解决总结1中存在的问题

前序章节&#xff1a; 苍穹外卖Day01——总结1 解决总结1中存在的问题 1. 什么是JWT2. POJO、Entity、VO、DTO3. Nginx&#xff08;反向代理&#xff09;4. Data注解 1. 什么是JWT JWT&#xff08;JSON Web Token&#xff09;是一种用于在网络应用间传递信息的开放标准&#…

重学Java 2.Java入门程序

不破不立 ——24.1.11 1.开发三步骤 1.编写&#xff1a; a.创建一个文本文档 b.注意&#xff1a;将文件的后缀名显示出来 显示扩展名&#xff1a;点击查看->点击文件扩展名 2.编译&#xff1a; a.命令&#xff1a;javac java文件名.java b.注意&#xff1a;javac会将java文…

怎么使用好爬虫IP代理?爬虫代理IP有哪些使用技巧?

在互联网时代&#xff0c;爬虫技术被广泛应用于数据采集和处理。然而&#xff0c;在使用爬虫技术的过程中&#xff0c;经常会遇到IP被封禁的问题&#xff0c;这给数据采集工作带来了很大的困扰。因此&#xff0c;使用爬虫IP代理成为了解决这个问题的有效方法。本文将介绍如何使…

android 9 reboot流程

机器出现开机 自动进入fastboot模式。可能是init 那个进程挂了 然后调用了 RebootSystem(ANDROID_RB_RESTART2, “bootloader”); 函数进入重启流程&#xff0c;然后重启后进入fastboot 浅读一下reboot流程和怎么进入的fastboot 比如说是那个进程挂了调用了这个函数&#xff0c…

nuxt pm2使用、启动、问题解决方案

pm2简介 pm2是一个进程管理工具,可以用它来管理node进程&#xff0c;并查看node进程的状态&#xff0c;当然也支持性能监控&#xff0c;进程守护&#xff0c;负载均衡等功能&#xff0c;在前端和nodejs的世界中用的很多 pm2安装 安装pm2: $ npm install -g pm2查看pm2的安装…

哪种小型洗衣机好用?高性价比的小型洗衣机推荐

大型洗衣机作为家居必备小家电&#xff0c;对生活品质的提升十分显著&#xff0c;在很多人的认知中&#xff0c;这种大型洗衣机主要是用来清洁大件的衣服和外套的&#xff0c;不方便将内衣裤都放入到里面&#xff0c;内衣裤的材质和尺寸都是比较特殊&#xff0c;若是直接将其放…