.Net 的异步编程

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

历史

现在比较流行的异步编程应该是Task模式,这是基于Threadpool线程池实现的更加方便简单的开发模式,但是为了更好理解它的原理,有必要先了解一下它的前辈们。.Net的异步开发基本按照 异步模式->事件驱动->任务驱动 进化的

异步模式

微软为了实现异步开发,在大量的类中加入了以Begin和End为开头的方法。以下代码中,WebRequest类的使用BeginGetResponse方法请求网站信息,EndGetResponse方法则阻塞线程,直到结果返回到ar变量中

        private static void AsynchronousPattern()
        {
            Console.WriteLine(nameof(AsynchronousPattern));
            WebRequest request = WebRequest.Create(url);
            IAsyncResult result = request.BeginGetResponse(ReadResponse, null);

            void ReadResponse(IAsyncResult ar)
            {
                using (WebResponse response = request.EndGetResponse(ar))
                {
                    Stream stream = response.GetResponseStream();
                    var reader = new StreamReader(stream);
                    string content = reader.ReadToEnd();
                    Console.WriteLine(content.Substring(0, 100));
                    Console.WriteLine();
                }
            }
        }

如果需要调用用户自定义方法,可以使用代理delegate配合BeginInvoke和EndInvoke方法。代码如下

		public delegate string AsyncMethodCaller(int callDuration, out int threadId);
        private static void AsyncPattern()
        {
            AsyncMethodCaller caller= new AsyncMethodCaller(TestAsync);
            int threadid=0;
            IAsyncResult result = caller.BeginInvoke(3000, out threadid,null, null);
            Console.WriteLine("等待异步方法TestAsync执行完成");
            string res = caller.EndInvoke(out threadid, result);
            Console.WriteLine("Completed!");
        }
        static string TestAsync(int callDuration, out int threadId)
        {
            Console.WriteLine("TestAsync");
            for (int i = 0; i < 5; i++)
            {
                Thread.Sleep(callDuration);
                Console.WriteLine("TestAsync:" + i.ToString());
            }
            threadId = Thread.CurrentThread.ManagedThreadId;
            return string.Format("");
        }

现在这种方法已经被淘汰,只有老项目中还能见到。

基于事件驱动的异步模式

从.Net 2.0开始,基于事件驱动的异步模式,这种模式是调用一个以Async结尾的方法,比如WebClient的DownloadStringAsync方法,当这个方法结束时将触发DownloadStringCompleted事件,用户可以在这个事件中写入自己的需要的东西。

private static void EventBasedAsyncPattern()
{
	Console.WriteLine(nameof(EventBasedAsyncPattern));
	using (var client = new WebClient())
	{
		client.DownloadStringCompleted += (sender, e) =>//当DownloadStringAsync返回时触发
		{
			Console.WriteLine(e.Result.Substring(0, 100));
		};
		client.DownloadStringAsync(new Uri(url));
		Console.WriteLine();
	}
}

任务驱动的异步编程

终于到了这篇文章的重头戏,从.NetFrameWork4.0开始,引入了Task类,微软极力推荐使用Task来执行异步任务,现在C#类库中的异步方法基本都用到了Task;net5.0推出了async/await,让异步编程更为方便。

Task是在ThreadPool的基础上推出的,ThreadPool中有若干数量的线程,如果有任务需要处理时,会从线程池中获取一个空闲的线程来执行任务,任务执行完毕后线程不会销毁,而是被线程池回收以供后续任务使用。当线程池中所有的线程都在忙碌时,又有新任务要处理时,线程池才会新建一个线程来处理该任务,如果线程数量达到设置的最大值,任务会排队,等待其他任务释放线程后再执行。线程池能减少线程的创建,节省开销。

To be continued

.net core 异步编程(async/await) 在 .NET Core 中,异步编程是非常重要的一部分,特别是在需要高性能和扩展性的时候。通过使用async和await关键字,可以简化异步代码的编写,使其更具可读性和表达性。 阅读详情

相关推荐

学习笔记--.NET Core中的异步编程

什么是异步编程 同步程序中的代码是运行在单一线程上的。 异步操作:从其它线程发起后,在一个新的单独线程上运行的操作。发起异步操作的线程不必等待异步操作完成。 异步编程的好处 对于需要长时间运行的操作,异步编程可以更大限度更有效地利用设备资源。 通过异步执行 CPU 或 I/O 绑定操作,提高 UI 程序的响应性 并行计算 .NET内置的异步方法 // Three things to note in the signature: // - The method has an async modi

weixin_47975226的博客 530

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

Task是DotNet3.0之后所推出的一种新的使用多线程的方式,它是基于ThreadPool线程进行封装的。

weixin_46711336的博客 1969

电赛2024年H题智能小车基于MSPM0G3507主控MCU(利用8路灰度加上MPU6050的解决方式)

最后我觉得这个项目最重要的部分还是陀螺仪的精准度,如果一个陀螺仪的精准度高,这个项目就十分简单了,像mpu6050这种陀螺仪精准度就稍微差了一点,他有个最严重的问题就是温漂,偏航角会随着温度变化为变化,这一点在跑发挥项一的时候十分关键的,因为这个只差基督就会导致车子跑偏,导致无法完成 整个项目。如果条件足够的话建议可以换一个好一点的陀螺仪,然后就是灰度如果没有条件同样也可以换成红外。以上就是本次项目的一些小建议。

weixin_60991529的博客 6241

.Net 异步编程之Task

.NET里面的Task能够很方便地写出多线程的操作方法,比使用Thead类更加优雅。.NET 有一个组件-BackGroundWorker,也是支持异步编程的重要方面,在UI界面操作,需要等待较长时间的时候,我们就可以使用这些异步的方法去执行这些耗时的操作,UI线程的操作可以继续,后台线程执行完之后,给UI返回一个结果,这时候我们就很优雅地解决了多个线程之间的交互问题。         Andr

tomcat的专栏 2053

128x64 OLED屏的救星:手把手教你用纯C实现轻量级多级菜单

本文针对资源受限的单片机开发场景,提供了一套用纯C语言实现128x64 OLED屏轻量级多级菜单的完整方案。该方案摒弃了传统的树形指针结构,创新性地采用哈希表进行菜单项管理,核心代码不足200行,内存占用极低,逻辑清晰且易于维护。文章详细阐述了架构设计、实战演练及性能优化技巧,是STM32、ESP8266等小内存MCU项目的理想选择。

table的专栏 226

【斯坦福计网CS144项目】环境配置 & Lab0: ByteStream

前言 感觉学了不少 C++ 编程的知识和技术但比较缺少实践,于是打算找一些项目跟着做一做。 首先安利一个自学网站 CS自学指南,北大的同学做的,汇总了很多国内外高校 CS 相关的高质量公开课,其中大部分是有课程项目的。翻了翻感觉 Stanford 的这门 CS144 计网课的 Lab 比较有趣,难度也不错,就是它了! 课程网址:CS 144: Introduction to Computer Networking 我跟的是 2021 Fall 学期的版本。 准备工作 在上面的网站中先把 8 个实验的文档(

アルタイル 8163

C#基础知识学习——异步Task、Parallel 、 异步实例(十九)

异步用途通常用于执行完成时间较长的任务,比如:打开大文件、连接远程计算机、查询数据库等操作。应用程序调用方法异步执行某个操作时,应用程序可以在异步方法执行其任务时继续执行。异步机制异步编程采用future或callback机制,以避免产生不必要的线程。异步核心启动了的操作将在一段时间后完成, 这个操作正在执行时,不会阻塞原来的线程。启动了这个操作的线程可以继续执行其他任务,当操作完成时,会通知回调函数。异步与同步异步与同步是相对于同步而言,跟多线程不能同一而论。

weixin_45496521的博客 1683

基于 Quest 摄像头数据开发的原理介绍【Unity Meta Quest MR 开发教程】

比如想在识别到的现实物体上叠加虚拟物体,需要知道这个现实物体在 Unity 的世界坐标下的哪个位置,是带有 x,y,z 三个轴的数据的。而 WebCamTexture 捕捉到的图像只是个 2D 的平面,没有三维世界的深度信息,我们通过物体识别算法识别到的物体坐标只是在这个 2D 平面上的一个屏幕坐标,可以理解为 Quest 拍摄了一张照片,我们识别到这张照片上的某个像素点为需要识别的现实物体的中心。是不是看起来比较复杂?Quest 的相机访问功能是在安卓的。

qq_46044366的博客 2103

.net如何实现异步方法

在 .NET 中,有几种不同的方法可以实现异步方法。其中一种是使用 async 和 await 关键字,另一种是使用 Task 对象。 例如,下面是一个使用 async 和 await 关键字的示例: public async Task<int> GetDataAsync() { int data = await Task.Run(() => GetData()); ...

weixin_42576804的博客 664

NVIDIA显卡驱动历史版本全攻略:从官网隐藏入口到精准下载

本文详细介绍了如何获取NVIDIA显卡驱动历史版本的完整攻略,包括官网隐藏入口的揭秘、精准筛选驱动版本的技巧以及安装避坑指南。特别针对游戏玩家、创作者和老显卡用户提供了实用建议,帮助用户解决驱动兼容性问题,提升显卡性能。

m2n3o4p5的博客 3718

Simulink仿真状态空间中状态变量时域响应

起因 今天老师留了一道关于状态空间变量响应的题,于是想用simulink仿真,一开始使用state-space模块,但是发现它只能输出y,没办法显示状态变量的变化情况。然而状态变量之间的关系都可以表示为一阶微分方程组,因此我们考虑在Simulink中搭建微分方程组来求解这个问题。 微分方程组 x1˙=x2x2˙=−4x1−5x2+1(1)\dot{x_1}=x_2\\ \dot{x_2}=-4x_...

ZYunfei的博客 7444

.net异步编程

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

奥法鱼 2646

Python全栈入门到实战【基础篇 04】核心基础:变量与4种基础数据类型(int/float/str/bool)

本文介绍了Python编程中的变量和四种基础数据类型,作为后续所有语法的入门前提。变量是数据的“容器”,解决数据复用问题,而数据类型决定数据能进行的操作。文章详细讲解了变量的定义语法、命名规则(强制语法和推荐风格)、赋值与修改原理,并通过实操示例展示其应用场景。正确使用变量可以提升代码复用性、简化修改并增强可读性,是编程效率的核心原则。掌握这些基础知识能避免90%的新手语法错误,为学习更复杂的Python语法打下坚实基础。

那些看似不起波澜的日复一日,会在某天让你看到坚持的意义 4307

.Net 异步编程模式总结

使用 .NET 异步编程,在程序继续执行的同时对 .NET 类方法进行调用,直到进行指定的回调为止;或者如果没有提供回调,则直到对调用的阻塞、轮询或等待完成为止。例如,一个程序可以调用一个方法,该方法枚举一个较大的列表,同时主程序将继续执行。在完成枚举后,进行回调并且程序对它进行寻址。 异步编程是由 .NET 框架的许多区域支持的功能,这些区域包括: ...

262

在blender中安装vtk插件

Blender 是一个开源的、功能强大的3D计算机图形软件,广泛用于创建动画片、视觉效果、艺术作品、3D打印模型、互动3D应用程序和视频游戏。Blender 是由 Blender 基金会开发和维护的,具有丰富的功能和灵活的扩展性。在github上下载zip插件。

如果想成为中心,那么就到中心去吧。 292

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

.Net--异步编程

如果你能理解上面的所有内容,那么大概以下几点,你是可以看的懂的,可以帮助更好的理解它。1.“调度指的是可能是别的线程暂时不用了拿过来,也可能是从线程池中新建一个”,线程池的调度机制本身就是 “复用优先、新建次之”,避免了频繁创建 / 销毁线程的开销,这也正是异步编程能提高线程利用率的原因之一。2.“方法声明必须为 Async Task 类型”,严格来说,异步方法的返回类型可以是Task(无返回值)、Task<T>(有返回值)或void(仅用于事件回调),但是async Task。

weixin_64921076的博客 1888

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

.net 异步编程小结

.net 异步编程小结 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace Test { public class MyMain {

学而时习之 786

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

谈谈.NET CORE 中的异步编程

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

覃鸿宇的博客 4123

.net 异步编程模式

net 提供了三种模式的异步编程,分别是1、基于任务的异步模式(TAP),该模式使用单一方法表示异步操作的开始和完成。TAP是再.net framework4引入的。。使用和关键字。它简化了异步编程,代码更简洁,易于理解和维护。2、基于事件的异步模式(EAP),是提供异步行为的基于事件的旧模型。EAP 使用事件和委托来实现异步操作。它的优点是代码可读性高,适合 UI 编程,但缺点是增加了代码的复杂性,需要处理多个事件。3、异步编程模式(APM),也被称为。

T_Tboy的博客 623

.Net Core异步编程

.Net Core异步编程 一. “异步方法”:用async关键字修饰的方法 异步方法的返回值一般是Task,T是真正的返回值类型,Task.惯例:异步方法名字最好以Async结尾,这样方便我们只要是async 即使方法没有返回值,也最好吧返回值声明为非泛型的Task. 调用泛型方法时,一般在方法前加上await关键字,这样拿到的返回值就是泛型指定的T类型; 异步方法的"传染性": 一个方法中如果await调用,则这个方法也必须修饰为async static async Task Main(string

xiaososa的博客 1269

异步编程的.NET历史

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

singhwong 268

.Net Code异步编程

什么是异步编程 当一个异步过程调用发出后,调用者不能立刻得到结果。基于事件机制,实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。比如,你现在要有一批数据要大数据要入库,你又不想一边入库一边等待返回结果,你可以用异步,将大数据推入一个队列,然后另外一个线程来操作这个队列里面的数据入库,入完了,就通知一下主线程。这段时间你的主线程可以做任何事。 异步编程的四种方法 一、回调函数 假定有两个函数f1和f2,后者等待前者的执行结果。如果f1是一个很耗时的任务,可以考虑改写f1,把f2写成f1的回调

lxz2018173805的博客 1410

.Net异步编程 1

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

Norman_Lin的博客 676

.NET异步编程模式(一)

.NET 提供了三种异步编程模型 - TAP, EAP, APM

jqwang_2009的专栏 385

.NET 8/9异步编程

【代码】.NET 8/9异步编程。

Made In SQL 1208
上一篇: 【179】最大数
下一篇: Difference between spring-data-jpa and spring-boot-starter-data-jpa
CSharpIsDog
博客等级 码龄5年 0粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值