初探asp.net异步编程之await
终于毕业了,也顺利进入一家期望的旅游互联网公司。27号入职。放肆了一个多月没写代码,好方啊。
另外一下观点均主要针对于await.
请先看这段话,来自async in C# 5.0. 接下来几个月的时间,我将花时间来简单翻译这本书。
一.根据代码和执行结果,初探异步编程的执行过程。
*问题1:await会让当前线程一直等待吗?await等待的时间中一直占用线程资源吗?
*问题2:等待await数据返回交给等待线程再继续向下执行吗?
*问题3:向await下一条语句执行的线程,是执行await的线程吗?
二.异步编程async,await的使用意义和适用场景。
*问题1:异步编程可以让程序变快吗?
*问题2:异步编程执行耗时计算有用吗?
*问题3:既然异步编程执行顺序和同步相同,那么其意义何在?
测试代码
class Program { static void Main(string[] args) { Task.Run(()=>FirsTask()); Console.ReadLine(); } public static async Task<string> FirsTask() { Console.WriteLine("1.当前线程是:" + Thread.CurrentThread.ManagedThreadId); var result = await SecondTask(); Console.WriteLine("6.当前线程是:" + Thread.CurrentThread.ManagedThreadId); return result; } public static async Task<string> SecondTask() { using (var client = new HttpClient()) { Console.WriteLine("2.当前线程是:" + Thread.CurrentThread.ManagedThreadId); var result = await client.GetAsync( "http://stackoverflow.com/questions/37991851/jenkins-configure-page-not-loading-version1-651-3-chrome-browser"); await ThirdTask(); Console.WriteLine("5.当前线程是:" + Thread.CurrentThread.ManagedThreadId); return await result.Content.ReadAsStringAsync(); } } public static async Task<string> ThirdTask() { using (var client = new HttpClient()) { Console.WriteLine("3.当前线程是:" + Thread.CurrentThread.ManagedThreadId); var result = await client.GetAsync( "http://stackoverflow.com/questions/37993657/managing-outgoing-calls-settings-in-skype-for-business-client-using-remote-power"); Console.WriteLine("4.当前线程是:" + Thread.CurrentThread.ManagedThreadId); return await result.Content.ReadAsStringAsync(); } } }
输出结果






输出结果说明了前三个问题:
我们可以看到输出1和6,2和5,3和4往往不是相同的线程,但是也未必不是相同的线程。 事实证明,await不会让当前线程等待await的结果,继而由等待线程继续向下执行。 而是,遇到await时,当前线程会被释放到线程池。在await返回结果后,在调用任意空闲线程向下执行。
由于当前线程遇到await时会被释放到线程池,不会在时间上的等待中占用线程资源。 事实也证明,我们当前异步代码的执行顺序和同步代码执行顺序是相同的,在这样的情况下,线程被释放就是可以被重复利用的。 这样的重要意义在于,iis中线程池线程数是有限的,如果当前可以并发一百个请求,在同步情况下, 那么一百个请求导致一百个线程都在等待中。但是在异步过程中,线程被释放了,阻塞等待的时间没有了,也就可以容纳更多的请求。 程序要向下执行,依然要等到await结果,所以说同步和异步的执行时间是一样的,不会因为异步而减少执行时间。
异步编程特别适用于网络操作,因为网络操作发起请求之后等待它完成就行,所以这时候执行到这的线程,可以释放并会到线程池中,网络操作执行完成之后,再从线程池中随机拿一个线程继续执行。
最后的补充:刚才讨论的是await的作用。之所以如上测试代码能够按照同步的过程来执行,是await的作用。比如我们在FirstTask中不等待SecondTask的结果时,那么执行顺序是会改变的,6会提前输出出来。这是async的作用,不阻塞线程。我个人认为,在不需要await结果的情况下,async是可以减少执行时间的。
转载请注明本文地址: http://www.cnblogs.com/tdws/p/5613871.html%20%20%20%20
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?