C#扫盲篇(四):.NET Core 的异步编程-只讲干货(async,await,Task)

  关于async,await,task的用法和解释这里就不要说明了,网上一查一大堆。至于为啥还要写这篇文章,主要是其他文章水分太多,不适合新手学习和理解。以下内容纯属个人理解,如果有误,请高手指正。本文只对以下这段代码包含的异步编程写法作说明:
using System; using System.Threading.Tasks; using System.Threading; namespace ConsoleTest { class Program { static void Main(string[] args) { Console.WriteLine(ThreadID() + " =》主线程启动"); MethodAsync();//调用异步方法 Console.WriteLine(ThreadID() + " =》主线程继续执行"); Console.WriteLine(ThreadID() + " =》主线程结束 END"); Console.Read(); } static async void MethodAsync() { Console.WriteLine(ThreadID() + " =》MethodAsync方法开始执行"); string str = await DoSomething();//等待GetString执行完成 Console.WriteLine(ThreadID() + " =》MethodAsync方法执行结束"); } static Task<string> DoSomething() { Console.WriteLine(ThreadID() + " =》DoSomething方法开始执行"); return Task<string>.Run(() => { Thread.Sleep(4000);//导步线程 处理耗时任务 Console.WriteLine(ThreadID() + " =》DoSomething方法结束执行"); return "GetString的返回值"; }); } static string ThreadID() { return Thread.CurrentThread.ManagedThreadId.ToString(); } } }

 

以上代码的执行结果如图:

 

这个例子非常的经典,是曾经上学时老师给我们的实例,用来理解这几个关键词特别好。 

看完代码的执行顺序,以下对新手,包括自己曾经的疑问做一些简明扼要的解释,希望一两句话能让大家马上知道,不至于被网上各种文章绕晕。

疑问一:await会阻塞当前线程,等异步线程干完活了再跑?

不会阻塞。当前线程会一直跑进异步方法里,直到遇到要新开一个线程干活时就返回继续跑。此时,新线程在那里干活,主线程干完活就忙其他事去了。新线程干完活,回来await的地方把接下来的活继续干了。

疑问二:async+await 和同步执行有什么好处,都是要一个线程干活,一条龙干到底不好吗,非得自己干到一半交给另一个线程去干,别人干活不用开销吗?

这个问题的关键就是有些IO事情真的不需要CPU派一个线程去干,去了也干不了。比如读写文件,以往同步方法时,派一个线程去读写点东西的时候,这个线程肯定是等在那的,读写这个事情是硬盘去做的,线程就是个使者,告诉硬盘要做哪些事就行,硬盘干完活就告诉线程,线程拿着结果开心地继续干下面的活。那异步就是线程通知硬盘去读写后自己就回去该干嘛干嘛去,不必等在硬盘家门口等消息。硬盘读写的时候,这个线程是非阻塞的,可以干其他活,提高效率。硬盘读写完,会通知CPU,叫他派一个线程来拿结果,(如果框架是单线程的,那还是这个线程过来)这个线程拿到结果后会继续执行之前那个线程未干完的活,至于上下文信息,底层会交代好,不在这里讨论,太深。这个IO事情有很多,比如访问数据库,请求网络等。


往期精彩:

 

  首发自:【程序员不帅哥 】公众号

  原文链接:https://mp.weixin.qq.com/s/P2oN-2au3x5oTbzlrC5WYg

  扫码关注,更多精彩内容及时获取,一起提高,一起加油


__EOF__

本文作者程序员不帅哥
本文链接https://www.cnblogs.com/Mr-Worlf/p/14267402.html
关于博主:一个精通抄代码的老猿
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   程序员不帅哥  阅读(1675)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示