.Net6.0系列-3.Net 6及以上异步编程(二)

.NET5.0中使用异步编程 一、为什么要使用异步编程?.NET Core时代为什么很多方法都支持异步? 1、为什么要使用异步编程? 异步可以快速响应用户界面。 对于不需要单独再开一个线程的背景下,可以发起异步,等待回调。因为线程的创建和销毁是昂贵的。 2、回答了第一个问题,第二个问题答案也就迎刃而解了。 在.NET5.0中,包括以后的版本,能用异步的地方都用异步。对不不支持的用Wait(无返回值)、Result(有返回值),这种情况会有死锁风险。 二、异步编程之async、await 异步编程,不等于提高单个执行速度,但 阅读详情

一.异步方法不等于多线程,异步方法的代码并不会自动在新线程中执行除非手动将代码放到新线程中

static async Task Main(string[] args)
{
	Console.WriteLine("调用之前:"+Thread.CurrentThread.ManagedThreadId);
	double r=await CalcAsync(5000);
	Console.WriteLine($"r{r}");
	Console.WriteLine("调用之后:"+Thread.CurrentThread.ManagedThreadId);
}

public static async Task<double> CalcAsync(int n)
{
    //下面这段代码输出的线程ID调用前和调用后的线程ID是一致的
	/*
	Console.WriteLine("CalcAsync,"+Thread.CurrentThread.ManagedThreadId);
	double result=0;
	Random=new Random();
	for(int i=0;i<n;i++)
	{
		result=rand.NextDouble();
	}
	return result ;*/
	//下面这段代码输出的线程ID,调用前和调用后的线程ID不一致,输出的是新线程ID
	return await task.Run(()=>
	{
		Console.WriteLine("CalcAsync,"+Thread.CurrentThread.ManagedThreadId);
		double result=0;
		Random rand=new Random();
		for(int i=0;i<n*n;i++)
		{
			result+=rand.NextDouble();
		}
		return result;
	});
}
//下面是直接将Task运行完成之后的结果封装到Task里面,而没有await
public static Task<double> Calc2Async(int n)
{
	return Task.Run(()=>{
		Console.WriteLine("CalcAsync,"+Thread.CurrentThread.ManagedThreadId);
		double result=0;
		Random rand=new Random();
		for(int i=0;i<n*n;i++)
		{
			result=result+rand.NextDouble();
		}
		return Task.FromResult(result);
	})
}

二.为什么有的异步没有用async修饰
async方法的缺点:1.异步方法会生成一个类,运行效率没有普通方法高 2.可能会占用非常多的线程
标明async只是为了更方便的使用await,第二种没有使用async,如果需要将Task的结果拿出来进行操作的时候
需要使用async和await

static async Task Main(string[] args)
{
	string s=await ReadAsync(1);
	Console.WriteLine(s);
}
//第一种写法
static async Task<string> ReadAsync(int num)
{
	if(num==1)
	{
		string s=await File.ReadAllTextAsync(@"e:\temp\a\1.txt");
		return s;
	}
	else if(num==2)
	{
		string s=await File.ReadAllTextAsync(@"e:\temp\a\2.txt");
		return s;
	}
}
//第二种写法,这种写法效率高,ReadAsync的返回值类型为Task<string>
static Task<string> ReadAsync(int num)
{
	if(num==1)
	{
		return File.ReadAllTextAsync(@"e:\a\1.txt");
	}
	else if(num==2)
	{
		return File.ReadAllTextAsync(@"e:\a\2.txt");
	}
}

三 .为什么尽量少使用Thread.Sleep();
Thread.Sleep(3000)与await Task.Delay(3000)的区别
Thread.Sleep():终止的是当前线程,会降低并发(类似于接线员停止了)
await Task.Delay():是编译后的MoveNext中延时(我们打10086停止说话,但是接线员可以去接别人的电话)

异步编程详解(.NET) 在之前写的一篇关于async和await的前世今生的文章之后,大家似乎在async和await提高网站处理能力方面还有一些疑问,很多网站本身也做了不少的尝试。今天我们再来回答一下这个问题,同时我会做一个async和await在WinForm中的尝试,并且对比在4.5之前的异步编程模式APM/EAP和async/await的区别,最后我还会探讨在不同线程之间交互的问题。 阅读详情

相关推荐

SerialPort串口通讯,.net SerialPort控件

vb.net + SerialPort串口通讯,.net SerialPort控件,源码文件

.Net6.0系列-2.Net 6及以上异步编程(一)

进行切分为多个状态(swich(){case}),对async方法的调用会被拆分为对MoveNext的调用,await看似等待,经过编译。可用ILSpy反编译器反编译,该代码,可知async的方法会被C#编译器编译成一个类,根据await调用。await调用的等待期间,.Net会把当前的线程返回会给线程池,等异步方法调用执行完毕之后,1.异步方法的返回值一般是Task,T是返回类型,Task,异步方法以Async结尾.框架会从线程池再取出一个线程来执行后续的代码,如果下面的代码sb很短,则不会切换线程,

cdc8596的博客 1508

Ubuntu20.04实时内核补丁PREEMPT_RT编译与安装全流程解析

本文详细解析了在Ubuntu20.04系统上编译与安装实时内核补丁PREEMPT_RT的全流程。从内核与补丁版本匹配、编译环境准备,到内核配置、编译排错,再到最终安装、验证与进阶优化,提供了手把手的实战指南,旨在帮助机器人、工业控制等对实时性有苛刻要求的开发者构建低延迟、高确定性的Linux系统。

weixin_29213827的博客 187

.NET 6.0 中引入异步流(Async Streams)

.NET 6.0 中引入异步流(Async Streams)

book_dw5189的博客 944

COMSOL实现裂缝性储层油水两相流模拟的关键技术

多孔介质中的流体流动模拟是油气藏开发的核心技术,其基本原理基于达西定律和质量守恒方程。在裂缝性储层中,离散裂缝网络与基质系统的耦合流动带来了特殊的数值挑战。通过COMSOL Multiphysics平台实现的多物理场耦合技术,可以精确模拟油水两相在复杂裂缝系统中的渗流行为。该技术采用Level Set方法表征裂缝几何形态,结合自适应网格生成技术解决狭窄裂缝的网格剖分难题,并创新性地引入Bang-Larsen毛管压力滞后模型,显著提高了采收率预测精度。这些方法在致密油藏开发、水驱优化等工程实践中具有重要应用价

weixin_34005090的博客 229

子网划分详解

还不会子网划分?看这篇就够了,保姆级教程

m0_47584619的博客 6093

C# 串口操作系列(2) -- 入门篇,为什么我的串口程序在关闭串口时候会死锁 ?

     第一篇文章我相信很多人不看都能做的出来,但是,用过微软SerialPort类的人,都遇到过这个尴尬,关闭串口的时候会让软件死锁。天哪,我可不是武断,算了。不要太绝对了。99.9%的人吧,都遇到过这个问题。我想只有一半的人真的解决了。另外一半的人就睁只眼闭只眼阿弥佗佛希望不要在客户那里出现这问题了。     你看到我的文章,就放心吧,这问题有救了。我们先回顾一下上一篇中的代码 

不要抱怨,要不断的追求,上帝才会给你。 9万+

深入解析Mifare Classic Crypto1认证流程与密钥交换机制

本文深入解析Mifare Classic Crypto1认证流程与密钥交换机制,详细介绍了Crypto1加密算法的工作原理、认证初始化阶段、随机数交换与密钥流生成过程,以及双向验证步骤。文章还分析了Mifare Classic的安全漏洞,包括随机数生成缺陷和密钥流恢复攻击,并提供了Proxmark3实战演示和防护建议。

c6d7e8f9g的博客 898

【.NET Core】异步编程模式

基于任务的异步模式(TAP),该模式使用单一方法表示异步操作的开始和完成。TAP是在.NET Framework 4 中引入的,这是在.NET中进行异步编程的推荐方法。C#的async和await关键词和Await运算符为TAP添加了语言支持。**基于事件的异步模式(EAP)**是提供异步行为的基于事件的旧模型。这种模式需要后缀为Async的方法,以及一个或多个事件,事件处理程序委托类型和EventArg派生类型。EAP是在.NET Framework2.0中引入的。建议新开发中不再使用这种模式。

记录总结工作过往 3004

置顶必读(1) |《滚雪球学SpringBoot 3.x》· 高质量专栏介绍,你值得拥有!

《滚雪球学SpringBoot 3.x》 并不是普通的技术讲解合集,它是专为开发者精心设计的系统化学习路径。通过不断“滚动学习”,我们将带领你从基础入门到高阶应用,从理解每一行代码到设计和优化大规模分布式系统,最终帮助你成长为一位精通 spring架构 的工程师。

**My Coding Family** 12万+

主成分分析(PCA)简洁高效MATLAB实现详解

本文介绍了一个简洁高效的PCA算法实现。该实现通过SVD分解计算主成分,避免了显式协方差矩阵计算,支持两种降维方式:固定维度或按能量比例自动选择。核心步骤包括数据中心化、SVD分解和维度选择,代码量少但功能完整,适用于数据预处理、降维和特征提取等任务。实现中考虑了稀疏矩阵转换、默认参数处理等细节,可直接应用于MATLAB环境。

m0_62153576的博客 63

.net异步编程

一.如何理解异步编程使用 .NET 异步编程,在程序继续执行的同时对 .NET 类方法进行调用,直到进行指定的回调为止;如果没有提供回调,则直到对调用的阻塞、轮询或等待完成为止。例如,一个程序可以调用一个方法,该方法枚举一个较大的列表,同时主程序将继续执行。在完成枚举后,进行回调并由程序对它进行寻址。二.使用异步编程的领域文件IO 流IO 套接字IO远程处理信道(HTTP、TCP)和代理使用 AS

奥法鱼 2646

AI智算-K8s+vLLM & Ray:DeepSeek-r1 671B 满血版分布式推理部署实践

自从上次发布 【AI-智算】K8s+SGLang实战:DeepSeek-r1:671b满血版多机多卡私有化部署全攻略] 文章后,本次将演示另一个主流推理引擎工具——vLLM,结合K8s、LWS、Ray、Volcano等技术栈,部署DeepSeek-r1 671b 满血版分布式推理集群,并对比其与SGLang推理引擎的性能表现。

Kason_iWiki 1825

谈谈.NET CORE 中的异步编程

什么是异步编程? 同步程序中的代码运行在单一线程上。 异步操作:从其它线程发起后,在一个新的单独线程上运行的操作。发起异步操作的线程不必等待异步操作完成 为什么使用异步编程? 对于需要长时间运行的操作,异步编程可以更大限度更有效地利用设备资源。 通过异步执行 CPU 或 I/O 绑定操作,提高 UI 程序的响应性 并行计算 什么时候使用异步编程 异步适用于 CPU...

覃鸿宇的博客 4123

Steam崩溃:ntdll.dll报错0xc0000374...如何解决?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值。

**My Coding Family** 1156

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

.NET6中的高性能异步编程模式与最佳实践解析

NET 6中的高性能异步编程模式通过`async`/`await`、`Task`、`ValueTask`以及丰富的API,为开发人员提供了强大而灵活的工具集。深入理解其工作原理,并遵循避免阻塞、合理选择返回类型、利用异步流和并行处理等最佳实践,是构建响应迅速、资源利用率高的现代应用程序的关键。随着.NET平台的持续演进,掌握这些核心概念将帮助开发者充分挖掘框架的性能潜力。

技术派做新零售创业 325

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

.Net 的异步编程

.Net 的异步编程历史异步模式功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 历史 现在比较流行的异步编程应该是Task模式,这是基于Threadpool线程池实现的更加方便简单的开发模式,但是为了更好理解它的原理,有必要先了解

CSharpIsDog的博客 721

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

在 .NET 4.0 下编写扩展代码以支持 async 异步编程

  微软在C# 5中引入了async、await这两个异步编程的关键字,要使用这两个关键字需要你的IDE支持C#5.0语法,也就意味着你需要使用VS 2012版本以上IDE,或者在Vs2010卸载其编译器在重新安装,这并不是本文的重点,有需求的朋友点击这篇博客,现在都快接近2019年,VS2019 预览版都出来了,现在使用Vs2010确实有点更不上时代了,建议大家升级一下vs,其他问题可...

aocheng6695的博客 1068

.Net异步编程

异步编程与同步编程,异步编程的基本使用,Result的使用,异步编程与多线程,WhenAll方法和WhenAny方法

qq_58159494的博客 1169

异步编程模型(C#5.0系列)

关于C#5.0的新功能——async和await关键字。它们是语法糖,可以简化异步操作代码的构造。当C#编译器看到一个await表达式时,它会生成代码,该代码自动异步地调用该表达式,然后立即将控制流返回给调用方,以便调用方代码可以继续执行而不会阻塞。异步操作完成后,控制流将转到await表达式下方的代码,并按顺序执行代码,直到达到退出条件为止(退出条件可以是:方法或循环的迭代的结尾等)。我强...

寒冰屋的专栏 554

异步编程的.NET历史

在学习新的async和await关键字之前,先看看.NET Framework的异步模式。从.NET Framework 1.0开始就提供了异步特性,而且.NET Framework的许多类都实现了一个或这多个异步模式。 下面开始执行同步网络调用,然后介绍不同的异步模式: 异步模式 基于事件的异步模式 基于任务的异步模式 异步模式是处理异步特性的第一种方式,它不仅可以使用几个API,还可...

singhwong 268

.NET异步编程之新利器——Task与Await、Async

一.FrameWork 4.0之前的线程世界       在.NET FrameWork 4.0之前,如果我们使用线程。一般有以下几种方式: 使用System.Threading.Thread 类,调用实例方法Start()开启一个新线程,调用Abort()方法来提前终止线程。 使用System.Threading.ThreadPool类,调用静态方法QueueUserWorkIte...

sinolover的专栏 1267

.Net异步编程 1

.Net异步编程 1 请大家关注我的微博:@NormanLin_BadPixel坏像素 废话不多说,先去看大神们的教程吧。 C#:异步编程和线程的使用(.NET 4.5 ) 本引用文是由葡萄城控件技术开发团队发布,转载请注明出处:葡萄城控件 这里我会从大佬的原文中摘取一些我认为重要的话。 .NET中提供了三种不同的异步模式: 1. 异步编程模型(APM)模式 2....

Norman_Lin的博客 676

那些年,我们一起追寻的异步编程[系列]

序 经过一番努力,我写的异步编程系列也算有头有尾,当然不是说这个系列已经更新完毕,这个头尾只是表示新旧知识点都有简单涉及到,接下去我还会丰富这一系列并且有机会整个小应用(愿景是弄一个开源组件吧,结合socket)。 术语: APM    异步编程模型,Asynchronous Programming Model EAP    基于事件的异步编程模式,Event...

112

.NET微服务迁移至.NET6.0的故事

本次迁移涉及的是公司内部一个业务子系统,该系统是一个多样化的应用,支撑着公司的多个业务方向。目前,该系统由40多个基于.NET的微服务应用构成,使用数千个CPU核心和数TB内存,在数百个Linux容器中运行。每天,该系统需要处理数十亿次请求。该系统其中大部分服务是在2018-2019年左右由老旧.NET Framework、Java等系统重构而来,当时使用的是.NET Core 2.1,这几年业务...

dotNET跨平台 306
上一篇: .Net6.0系列-2.Net 6及以上异步编程(一)
下一篇: .Net6.0系列-4.Net 6及以上异步编程Cancellation以及WhenAll/WhenAnyToken详解(三)
奇点码农
博客等级 码龄19年 60粉丝 140原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值