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

c#笔记之同步异步

写在前面1.同步异步和多线程的关系为什么会有这个疑问:因为现在现在官方唯一推荐的异步就是Task + async/await但是Task又和多线程有使用;异:先确定一个答案:就是异步和多线程是两种东西,异步可以在单线程里异步也可以在多线程里异步;(就像一个人也可以煮饭的等饭煮好的时间去煮菜)同步异步是等不等的问题;比如煮饭和炒菜两件事,同步就是先煮饭等着饭煮好了再做菜;异步就是先淘米上锅煮饭然后在等饭煮好的这段时间里顺便去做菜,在你做菜的这段时间不管饭煮没煮好都会先等你把菜做好;饭煮好了菜没做完你就继续做菜;多线程就是多来一个人,这时候可以一个人做菜一个人煮饭;同:多线程和异步都是解决时间的问题,因为一直做一件耗时间的事情会卡ui主线程,两者都是把卡ui主线程的时间减少;多线程解决时间耗在一直做的过程中,也就是常说的CPU密集型计算,比如说要一个非常复杂的计算要算非常久,那就创个线程交给那个线程做这样不会卡ui主线程;异步解决时间主要是等结果,比如说读取或者写入文件,http通信等待对方返回结果这种;这时候就在告诉系统要读写什么之后或者是http通信告诉对方我要读取之后先释放主线程ui,让主线程ui可以更新继续更新界面;等写完了或者http对方回信了再叫主线程ui来处理;学习内容:一、同步异步1.1什么是同步异步同步和异步是对干一件事的而且这件事主要还是等的时候比如去点了一杯奶茶,主要的时间是等奶茶做好;这个等待的过程的描述;如果你一直在原地等奶茶做好再去干别的那就是同步,等奶茶的时候先去做别的事比如逛别的店之类的那就是异步;1.2异步发展流程1.2.1最开始的异步(了解就好)在最开始的时候发现同步等一件事做完在做第二件事情,而且大部分时间是耗在等上面而不是实实在在的一直干活上太耗时间了;而且最开始的cpu不行线程太少了每条线程都非常宝贵;要是线程大部分时间都耗在等上太浪费了;就产生了异步的概念,也就是在耗时的操作上要把ui主线程给释放出来不要一直在等;最开始的时候就只能通过一下系统底层的异步api来实现,这些一般都是一些io操作由硬件来完成这样在主线程就可以直接把耗时的任务交给系统硬件完成;实现了主线程不会一直被占用;这样这是把任务交给了系统硬件;早期不需要返回值的异步直接调用系统底层api就好了,这样主线程就去干别的事了,异步的事情硬件去做,主线程就不管了;在早期的 Win32 API 编程中,如果你只是想让文件复制或者让音乐播放,且完全不关心它什么时候播完、有没有失败,你确实可以直接调用一个异步 API,然后扭头就走;但是我要知道结果怎么办比如读出来的数据之类的;方法是要时间才能拿到结果的,我异步是不可能等的,不等又没有结果,有没有一种办法可以等方法的做完了之后拿结果这样我不用等呢?这时候就需要回调函数了;回调函数就是把一个方法A作为参数给另外一个方法B在B的内部执行别的代码之后再执行,这就完全符合异步要结果的逻辑(等异步操作完才会执行回调函数),等io操作完之后再执行回调函数,在回调函数里对结果进行需要的操作;(这时候不一定是主线程来执行回调函数,所以要操作ui界面要在回调函数里加this.invoke)这时候如果要想知道这个异步执行的进度就只能是把任务分段,比如一个10m的文件读取就分割2次一次读5m读完这5m加个回调函数读剩下的5m;想要更加精细的知道进度就分更加细分5次10次;这样就会产生非常多的回调,这就是创造Task的两个非常重要的原因:一个是结果拿不出来只能在回调函数里操作,还有一个是回调多代码看起来乱,难阅读;using System; using System.IO; class Program { static void Main() { FileStream fs = new FileStream("test.txt", FileMode.OpenOrCreate); byte[] buffer = new byte[1024]; Console.WriteLine("开始异步读取文件"); // ================================ // 🔥 最底层原生异步 API // MyAsyncCallback就是 回调函数 // ================================ fs.BeginRead(buffer, 0, buffer.Length,MyAsyncCallback, fs ); // 🔥 立刻返回!不阻塞!不等读取完成! Console.WriteLine("主线程继续跑,没被卡住"); Console.ReadLine(); } // 🔥 底层读完后,自动调用这个回调 static void MyAsyncCallback(IAsyncResult ar) { FileStream fs = (FileStream)ar.AsyncState; int len = fs.EndRead(ar); // 结束异步 fs.Close(); Console.WriteLine($"异步读取完成,长度:{len}"); } }但是如果我要的异步操作不是io类型的呢比如是一个长时间的计算这种实打实的要一直占这cpu的操作呢;这时候也简单就是开个其他的线程就好了;这种情况依旧有那两个问题;using System; using System.Threading; class Program { static void Main(string[] args) { Console.WriteLine("=== 主线程开始 ==="); // 调用异步方法,把【回调函数】传进去 StartDownloadAsync(MyCallback); // 🔥 重点:这里会立刻执行!不会等下载! Console.WriteLine("✅ 方法已返回!主线程继续跑!没被卡住!"); Console.WriteLine("主线程自由干活中..."); Console.ReadLine(); } // ========================================= // 最原始的“异步方法”: // 自己开线程,不依赖任何 Task/async // ========================================= static void StartDownloadAsync(Action callback) { Console.WriteLine("→ 启动下载(开新线程)"); // 🔥 核心:自己新开一个线程! Thread t = new Thread(() = { // 这里在新线程里跑,不影响主线程 Thread.Sleep(2000); // 模拟下载2秒 Console.WriteLine("✅ 下载真正完成!"); // 做完了 → 调用回调 callback?.Invoke(); }); t.Start(); // 启动线程 // 🔥 关键:线程启动后,方法立刻返回!不等下载! } // ========================================= // 回调函数:事情做完才会执行 // ========================================= static void MyCallback() { Console.WriteLine("▶ 回调执行:处理下载结果"); } }二、Task为了解决返回值只能在回调函数里操作和回调函数多的问题在.NET Framework 4.0 引入了Task;(在直接从最开始的回调函数时代到Task之前还有EAP(基于事件的异步)这里就不讲了);在看下面之前最好先看多线程的那一章教程,因为下面只讲原理具体的Task有什么方法、属性、方法怎么用这些不会讲;2.1 Task是什么在上一章多线程的时候讲了Task的多线程的用法;现在才是Task真正的用法以及Task是什么Task = 任务一个 “将要执行 / 正在执行 / 已经完成” 的工作任务。可以这么理解 Task:Task 就是一张 “任务单”里面记录了:要做什么事记录:做完了没有记录:结果是什么记录:有没有报错还能写:做完后接着做什么(回调)它就是对一个操作的包装。最简单比喻你= 主线程(UI 线程)Task=任务(比如:下载文件、读取数据)线程= 干活的工人干一些cpu密集的任务比如复杂的计算硬件=也是干活的工人干一些io密集的任务比如读写文件,串口...你(主线程)下达一个Task(任务)系统就找个工人(线程)去做你不用等,继续干自己的事下面的看就好了第三大章才是重点;2.2(非重点)Task和早期的回调函数的关系(ContinueWith、whenAny、whenAll和waitany、waitall用法)从底层来看Task就是对最早期的回调函数异步的包装;回调函数既然不能返回那就把回调函数的值交给Task,这样返回这个Task就可以知道结果了;并且可以连着异步方法执行的状态到了哪一步有没有做完,有没有报错以及错误的什么都传给Task;连接Task和旧的回调方法靠的是TaskCompletionSource这个类;下面的例子就是怎么把旧的回调的报错结果包装成Task的底层逻辑;// 这就是“包装”的完整过程 Taskbyte[] ReadFileAsTask(string path) { var tcs = new TaskCompletionSourcebyte[](); // 1. 创建空容器 var fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read, 4096, true); var buffer = new byte[fs.Length]; fs.BeginRead(buffer, 0, buffer.Length, ar = // 2. 旧式回调异步 { try { fs.EndRead(ar); // 3. 从回调拿结果 tcs.SetResult(buffer); // 4. ⭐ 把结果塞进 Task } catch (Exception ex) { tcs.SetException(ex); // 5. 异常也塞进去 } }, null); return tcs.Task; // 6. 返回装好结果的容器 }下面的例子不完整只是用来介绍通过slowTask.Status这个属性来获取Task的状态,slowTask.IsCompleted这个属性来判断任务完成了,slowTask.Result属性来获取结果;状态 (Property)类型含义 (Meaning)什么时候会变成trueIsCompletedbool任务是否已完成任务成功、失败、或被取消时(到达三个最终状态之一)。IsFaultedbool任务是否因异常而失败任务内部的操作抛出了未处理的异常时。IsCanceledbool任务是否已被取消任务通过CancellationToken被成功取消时。CancellationToken是什么

相关文章:

c#笔记之同步异步

写在前面 1.同步异步和多线程的关系 为什么会有这个疑问:因为现在现在官方唯一推荐的异步就是Task + async/await但是Task又和多线程有使用; 异: 先确定一个答案:就是异步和多线程是两种东西,异步可以在单线程里异步也可以在多线程里异步;(就像一个人也可以煮饭的等…...

【收藏备用】2026年版 小白/程序员大模型转型全攻略(从入门到就业,零基础可冲)

2026年,大模型领域岗位需求较去年暴增280%,国产模型崛起、AI Agent落地、多模态普及,成为最具潜力的技术赛道✨。本文专为零基础小白、在职程序员打造,详细拆解进入大模型领域的完整转型路径,涵盖四大发展方向、基础能…...

从零开始学C++:30分钟掌握基础

从零开始学习C:基础知识C是一种高效、灵活的编程语言,广泛应用于系统开发、游戏引擎和科学计算等领域。作为初学者,你需要掌握核心概念来构建坚实基础。下面我将逐步讲解基础知识,并提供简单代码示例帮助你理解。整个过程从安装环…...

如何在Windows上快速部署Android应用:APK Installer完整操作指南

如何在Windows上快速部署Android应用:APK Installer完整操作指南 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 你是否曾经想在Windows电脑上直接运行Andr…...

终极指南:AMD显卡用户如何轻松玩转kohya_ss AI模型训练

终极指南:AMD显卡用户如何轻松玩转kohya_ss AI模型训练 【免费下载链接】kohya_ss 项目地址: https://gitcode.com/GitHub_Trending/ko/kohya_ss 你是否拥有AMD显卡,却苦于找不到好用的AI模型训练工具?好消息来了!kohya_s…...

C++核心:构造、析构与拷贝构造全解析

C 类的默认成员函数:构造、析构与拷贝构造1. 构造函数 (Constructor)作用:在对象创建时初始化成员变量,分配资源特点:函数名与类名相同,无返回类型可重载(支持不同参数列表)默认构造函数&#x…...

一键备份QQ空间十年记忆:GetQzonehistory免费开源工具完整指南

一键备份QQ空间十年记忆:GetQzonehistory免费开源工具完整指南 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否还记得十年前在QQ空间写下第一条说说的心情&#xff1f…...

MIUI自动任务工具完整指南:如何轻松实现小米社区自动化签到

MIUI自动任务工具完整指南:如何轻松实现小米社区自动化签到 【免费下载链接】miui-auto-tasks 一个自动化完成小米社区任务的脚本 项目地址: https://gitcode.com/gh_mirrors/mi/miui-auto-tasks 你是否厌倦了每天手动打开小米社区APP,重复点击签…...

第 9 课:堆(Heap)—— 解决 Top K 问题的神器,优先级队列的底层实现

这是面试绝对高频考点,没有之一。几乎所有 "找前 K 个最大 / 最小元素" 的问题,最优解都是堆。这一课你会明白:堆是专门为 "快速获取最值" 这个单一需求设计的数据结构,它用最简单的结构,实现了最…...

统计假设检验入门:原理、应用与Python实现

1. 统计假设检验入门指南在数据分析的世界里,原始数据本身就像一堆未经雕琢的钻石原石——它们蕴含着价值,但需要专业的切割和打磨才能展现真正的光彩。统计假设检验就是我们用来"切割"数据的专业工具之一。作为一名从业多年的数据分析师&…...

HDFS 数据块(Block)机制深度解析:从原理到实战

💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快! 💝&#x1f49…...

从Opal到Pyrite:深入解析TCG存储安全标准的演进与选型

1. 从机械硬盘到自加密:存储安全的技术演进 记得十年前我第一次接触企业级数据安全时,大多数公司还在使用传统的机械硬盘配合软件加密方案。每次服务器重启都要等待漫长的解密过程,性能损耗高达30%以上。直到2012年第一次接触到支持TCG Opal标…...

【YOLOv5改进实战】BiFPN加权融合:从理论到代码,实现目标检测精度飞跃

1. BiFPN为什么能成为目标检测的"涨点神器"? 第一次接触BiFPN是在处理工业质检项目时遇到的痛点——小目标漏检率居高不下。当时试过各种数据增强和调参手段,效果都不理想,直到尝试用BiFPN替换原生的PANet,mAP直接提升了…...

RAGFlow源码解析-2、从源码构架ragflow v0.25.0镜像

一、背景 官方 RAGFlow 提供了标准的 Docker 镜像 infiniflow/ragflow:v0.25.0,但当我们对 Python 后端或 Web 前端进行了自定义修改(主要是DOC_ENGINE和关系数据库都换成seekdb)后,需要重新打包镜像。 本文记录了从零开始构建自定义镜像 lt/ragflow:0.25.0 并成功部署的…...

数学分析学习路径全解析(2024.04.20)

1. 数学分析学习路径全景图 数学分析作为现代数学的基石,常常让初学者望而生畏。我见过太多同学在图书馆抱着厚厚的教材一筹莫展,也辅导过不少考研学生如何突破学习瓶颈。经过这些年的教学实践,我总结出一个黄金法则:选对路径比盲…...

OceanGPT/OceanGym:基于AI与强化学习的海洋智能体仿真训练平台

1. 项目概述:当大模型遇上海洋模拟器最近在AI和海洋科学交叉领域,一个名为“OceanGPT/OceanGym”的项目引起了我的注意。乍一看,这像是一个将大型语言模型(GPT)与海洋环境模拟(Gym)结合的尝试&a…...

spring ai alibaba原理源码分析(一)-架构

简介 spring ai alibaba是java的ai agent框架&#xff0c;本系列将深入剖析 Spring AI Alibaba 的源码实现与核心原理&#xff0c;不仅指导agent的开发&#xff0c;更为了改造框架&#xff0c;增加新特性 系列内容&#xff1a; 系列(一) 架构 本文<< 系列(二) agent…...

TestDisk PhotoRec:专业级数据恢复工具如何拯救你的丢失文件与分区

TestDisk & PhotoRec&#xff1a;专业级数据恢复工具如何拯救你的丢失文件与分区 【免费下载链接】testdisk TestDisk & PhotoRec 项目地址: https://gitcode.com/gh_mirrors/te/testdisk 在数字时代&#xff0c;数据恢复工具TestDisk和PhotoRec已成为技术爱好者…...

移动端架构演进与选型

移动端架构演进与选型&#xff1a;从单体到模块化的技术探索 移动互联网的快速发展对移动端架构提出了更高要求。从早期的单体架构到如今的模块化、组件化设计&#xff0c;移动端架构的演进始终围绕性能、可维护性和动态化展开。面对业务复杂度的提升&#xff0c;如何选择合适…...

Arm Cortex-A55浮点与SIMD架构深度解析

1. Cortex-A55浮点与SIMD架构概述在移动计算和嵌入式系统领域&#xff0c;Arm Cortex-A55作为一款高效的中端处理器核心&#xff0c;其浮点运算单元(FPU)和单指令多数据(SIMD)扩展功能对性能有着决定性影响。A55的浮点架构支持从半精度(16位)到双精度(64位)的多种数据格式&…...

BilldDesk终极指南:打破远程控制边界,开启跨平台协作新纪元![特殊字符]

BilldDesk终极指南&#xff1a;打破远程控制边界&#xff0c;开启跨平台协作新纪元&#xff01;&#x1f680; 【免费下载链接】billd-desk 基于Vue3 WebRTC Nodejs Flutter搭建的远程桌面控制、游戏串流 项目地址: https://gitcode.com/gh_mirrors/bi/billd-desk 还…...

GPU加速与树模型在制造业数据科学中的应用

1. 制造业数据科学中的GPU加速训练概述在半导体制造和芯片测试领域&#xff0c;每天产生的结构化数据量通常达到TB级别。以某8英寸晶圆厂为例&#xff0c;单条产线每月可产生超过500万条测试记录&#xff0c;每条记录包含300-500个特征参数。面对如此庞大的数据规模&#xff0c…...

Rust智能指针BoxRcArc使用场景

Rust作为一门注重内存安全的系统级编程语言&#xff0c;其所有权机制是核心特性之一。然而在实际开发中&#xff0c;有时需要更灵活地管理数据生命周期或共享数据&#xff0c;这时智能指针便成为关键工具。Rust提供了多种智能指针类型&#xff0c;其中Box、Rc和Arc是最常用的三…...

如何在5分钟内让PS4游戏体验翻倍?GoldHEN作弊管理器深度解析

如何在5分钟内让PS4游戏体验翻倍&#xff1f;GoldHEN作弊管理器深度解析 【免费下载链接】GoldHEN_Cheat_Manager GoldHEN Cheats Manager 项目地址: https://gitcode.com/gh_mirrors/go/GoldHEN_Cheat_Manager 还在为游戏中的难关卡住而烦恼吗&#xff1f;想要体验《血…...

6G时代AI原生网络与数字孪生技术实践

1. 无线通信行业的AI原生革命5G商用化进程尚未完全铺开&#xff0c;6G研发的号角却已吹响。作为深耕通信行业十五年的技术老兵&#xff0c;我亲眼见证了从3G到4G的过渡期&#xff0c;运营商和设备商们手忙脚乱地应对流量洪流&#xff1b;也经历了5G标准制定阶段&#xff0c;各家…...

基于多模态大模型的手机自动化新范式:从视觉理解到精准操作

1. 项目概述&#xff1a;当你的手机学会自己“点”屏幕 最近在跟几个做移动端测试和自动化的朋友聊天&#xff0c;大家普遍头疼一个问题&#xff1a;现在App功能越来越复杂&#xff0c;UI元素动态加载、嵌套层级深、甚至有些组件压根不暴露可访问性信息&#xff0c;传统的基于控…...

DDrawCompat:三步搞定Windows经典游戏兼容性问题的终极方案

DDrawCompat&#xff1a;三步搞定Windows经典游戏兼容性问题的终极方案 【免费下载链接】DDrawCompat DirectDraw and Direct3D 1-7 compatibility, performance and visual enhancements for Windows Vista, 7, 8, 10 and 11 项目地址: https://gitcode.com/gh_mirrors/dd/D…...

深度解析:基于异构计算的工业级AI视频中台架构,如何实现GB28181/RTSP跨平台部署与源码交付?

在安防行业进入智能化深水区的今天&#xff0c;开发者面临的痛点已从“如何调通视频流”转向“如何适配碎片化的底层硬件”。面对 NVIDIA GPU、瑞芯微 NPU、华为海思、算能等异构芯片&#xff0c;集成商往往需要投入海量人力进行 SDK 二次封装和驱动调试。 本文将从架构师视角…...

Legacy-iOS-Kit终极指南:如何让旧款iOS设备重获新生

Legacy-iOS-Kit终极指南&#xff1a;如何让旧款iOS设备重获新生 【免费下载链接】Legacy-iOS-Kit An all-in-one tool to restore/downgrade, save SHSH blobs, jailbreak legacy iOS devices, and more 项目地址: https://gitcode.com/gh_mirrors/le/Legacy-iOS-Kit Le…...

让ai执行多轮行动可以把任务变成限定长度的操作,让ai填空,比如我3d模型可以参数化全部给ai,ai返回修改后完全的模型

这个思路其实在多个领域都有对应的研究工作。我找到了一些相关的论文&#xff1a; PaperAuthorsSummaryCraftsMan3D: High-fidelity Mesh Generation with 3D Native Generation and Interactive Geometry RefinerTencent AI Lab et al.用迭代refiner来优化3D几何——生成初始…...