千家信息网

C#异步编程的示例分析

发表于:2025-01-21 作者:千家信息网编辑
千家信息网最后更新 2025年01月21日,小编给大家分享一下C#异步编程的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!异步编程在处理并发方面被使用的越来越
千家信息网最后更新 2025年01月21日C#异步编程的示例分析

小编给大家分享一下C#异步编程的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

异步编程在处理并发方面被使用的越来越多,之所以说上面一句话,是为了区分多线程编程。各位司机都知道,实际上异步编程的核心目标正并发处理。可还是经常有一些让人感到很无奈的说法和问题,比如说,异步编程能提高应用性能吗?他能缩短我处理任务的时间吗?他阻塞线程吗?如果不阻塞线程,断点为什么不继续向下执行,我的哥!线程释放到哪儿去了?我都读书少你别骗我,线程都释放了程序怎么运行?前台我用了Ajax,后台使用Async有必要吗?也许如果作为司机的你看到***一个问题,你只好摊手┑( ̄Д  ̄)┍。

多线程场景理解

也许在某些时刻,你想提高应用程序执行速度,尽快拿到一个结果。这个时候,应该选择的绝对不是Async和Task。打个比方说,你和你老婆周末去超市购物,刚一进超市门你发现结账的每条队伍都几十人,于是你用到了多线程,你去排队,一个人一个人的往前走,你老婆在另一头抓紧购物,在你快走到收银台的时候,你老婆来把购物车推给了你,于是你们直接结账回家。虽然这种行为很不文明,但这就是多线程,和异步编程一点关系都没有。

异步编程场景理解

那异步编程是什么情况,能解决什么问题呢?你和你老婆开了一家面包店,在初期只有你俩为顾客服务。没想到新店开张这么火,每分钟来一个顾客,而烤好一份面包需要两分钟。每来一位顾客你都拿着一片面包去后厨烤箱烤,并且你要和你老婆要花两分钟来等各自的烤箱完成任务。可是你等待的这两分钟,又来了两位顾客,着这样的速度下去,根本不能满足顾客们的需求呀!你已经发现你和你老婆的问题了:那就是你和你老婆这两条线程,都被烤箱花费的时间阻塞了!

你和你老婆为了解决阻塞的问题,又买了两台烤箱,并且为了避免新进顾客没人服务,每当你把面包送进烤箱后,标记其属于哪位顾客后立即返回,准备接待新的顾客,再有顾客光临,立马接待,并将新的面包送进另一个烤箱并标记,并立即返回等待为其他人服务。在面包烤好后,烤箱会以"叮"一声,注意在这一信号到达后,并不是一定要你去后厨烤箱取面包,而是你和你老婆谁不忙谁去取。这样处理后,高并发的顾客量,对你来说就显得得心应手了。你和你老婆做为两条线程,可以不断地以非阻塞的形式(不等烤箱),返回到顾客面前。但是需要注意的是不阻塞的概念,他不是让你的程序继续向下执行。就烤面包而言你的一个烤面包方法是这样的:

1.送入面包到烤箱 2.烤箱处理面包并给你结果 3.拿到面包送到顾客。所以说"不阻塞"的概念,不能让你直接做到第三步。在不阻塞期间,是没有线程在你的这个方法中的,这个方法还是要按照时间等待,等待在未来某个时刻的信号唤醒你或者你老婆,此时该方法恢复执行。所以说程序执行的时间依然不变,得到优化的是处理并发的能力,你店里(服务器)的吞吐量。

看着代码理解

异步编程应当被适用于IO密集型场景,非CPU计算密集场景。大家知道线程受CPU调度,如果你是四核CPU,那么在你的线程池中,拥有四个线程,进程每个虚拟CPU分配一个线程的时候,性能表现会最棒。既能高效运用CPU,又不用来回切换上下文损耗性能。你想想,CPU密集的场景中,CPU就是要占用你的线程,在这个时候异步编程没有任何用处。然而在IO场景中,文件IO由win32用户模式的API到windows内核模式,在内核模式中操作磁盘驱动程序。这期间,你的线程阻塞在驱动程序的响应中。而异步编程中,你的操作通知到磁盘驱动程序后,线程立即返回而非等待,在将来的某个时刻,驱动程序处理结束,处理结果放入CLR线程池队列中,恢复状态机,线程池中任意线程取出结果,方法继续向下执行。在网络IO中也是如此,只不过驱动程序变成了网络驱动程序。请看如下代码:

public static async Task DoSomeAsync()         {             using (var client = new HttpClient())             {                 var result = await client.GetAsync(                     "http://stackoverflow.com/questions/37991851/jenkins-configure-page-not-loading-version1-651-3-chrome-browser") .Result.Content.ReadAsStringAsync(); Console.WriteLine(result); //做一些其他操作 var res = 1 + 1; //---------------- return "";             }         }

在编译的时候,DosomeAsync会被编译成一个状态机方法,状态机是什么先别管,你可以把它当成一个黑盒子。在遇到GetAsync的时候,在DoSomeAsync中返回一个Task任务对象,并由await在Task对象上传递用于恢复状态机的方法,相当于调用了ContinueWith().这个方法顾名思义,以xxx继续。然后线程从DoSomeAsync中返回。返回后干嘛去了?该线程可以去处理其他事情了。在将来某一时刻,服务器向我们发送了一个相应,网络驱动程序得知请求完毕,恢复该方法继续执行剩下的其他代码。配一张乱糟糟的图

额外的好处

在GC的垃圾清理执行过程中,应用程序的所有线程都会被挂起,使用异步编程意味着在相同的并发量下,你可以使用更少的线程来完成处理,额外带来的好处就是,所需要清理的线程是更少的。还有一点就是,所使用的线程少了,CPU线程切换也变得更少。

以上是"C#异步编程的示例分析"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

线程 编程 程序 面包 顾客 烤箱 处理 方法 阻塞 驱动 场景 时候 就是 问题 驱动程序 服务 时刻 时间 状态 结果 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 电脑数据库有哪些用 管家婆辉煌安装数据库教程 如何通过esxi服务器管理 原来黑客现在是网络安全科研人员 新加坡软件开发公司地址 滁州网络技术专升本 互联网数据库自考试题及答案 linux进入服务器 pyqt5连接云数据库 nebula数据库招聘 服务器如何设置默认当前登录账户 常州人员服务管理软件开发 软件开发成本估算核心 网络安全宣传周活动知识答题 网络数据库系统主要功能 列出关系数据库的三个设计目标 数据库sql的内容 国家安全教育中网络安全征文 互联网金融科技学院 入户调查软件开发 易语言数据库远程保存图片 应用服务器内存小影响网页显示吗 宁波国研软件开发有限公司 网络安全金融日宣传周总结 力控科技工业互联网解决方案 网络技术详解 如何登录远程服务器下载文件 海弦收音机的服务器在哪里 xampp安装数据库监听 国家网络安全宣传周的目的
0