关于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

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

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

  1. C#进阶——从应用上理解异步编程的作用(async / await)

    欢迎来到学习摆脱又加深内卷篇 下面是学习异步编程的应用 1.首先,我们建一个winfrom的项目,界面如下: 2.然后先写一个耗时函数: /// <summary> /// 耗时工作 // ...

  2. js异步编程终级解决方案 async/await

      在最新的ES7(ES2017)中提出的前端异步特性:async.await. async.await是什么 async顾名思义是“异步”的意思,async用于声明一个函数是异步的.而await从字 ...

  3. 【C# TAP 异步编程】三、async\await的运作机理详解

    [原创] 本文只是个人笔记,很多错误,欢迎指出. 环境:vs2022  .net6.0 C#10 参考:https://blog.csdn.net/brook_shi/article/details/ ...

  4. How Javascript works (Javascript工作原理) (四) 事件循环及异步编程的出现和 5 种更好的 async/await 编程方式

    个人总结: 1.讲解了JS引擎,webAPI与event loop合作的机制. 2.setTimeout是把事件推送给Web API去处理,当时间到了之后才把setTimeout中的事件推入调用栈. ...

  5. EntityFramework 如何进行异步化(关键词:async·await·SaveChangesAsync·ToListAsync)

    应用程序为什么要异步化?关于这个原因就不多说了,至于现有项目中代码异步化改进,可以参考:实际案例:在现有代码中通过async/await实现并行 这篇博文内容针对的是,EntityFramework ...

  6. 异步编程系列第05章 Await究竟做了什么?

    p { display: block; margin: 3px 0 0 0; } --> 写在前面 在学异步,有位园友推荐了<async in C#5.0>,没找到中文版,恰巧也想提 ...

  7. JavaScript异步编程:Generator与Async

    从Promise开始,JavaScript就在引入新功能,来帮助更简单的方法来处理异步编程,帮助我们远离回调地狱. Promise是下边要讲的Generator/yield与async/await的基 ...

  8. 【.NET异步编程系列1】:await&async语法糖让异步编程如鱼得水

    前导 Asynchronous programming Model(APM)异步编程模型以BeginMethod(...) 和 EndMethod(...)结对出现. IAsyncResult Beg ...

  9. C#异步编程学习笔记之-async和await(续)

    书接上文,本篇主要记录的内容要点:1.针对async和await在实际应用中的使用方式:2.异步方法返回值(有返回值和无返回值)的两种情况: 示例一(无返回值): using System; usin ...

随机推荐

  1. Scrum 冲刺 第六篇

    Scrum 冲刺 第六篇 每日会议照片 昨天已完成工作 队员 昨日完成任务 黄梓浩 完成app项目架构搭建 黄清山 完成部分个人界面模块数据库的接口 邓富荣 完成登录注册接口 钟俊豪 完成部分博客圈模 ...

  2. Angular:惰性加载的模块

    ①通过ng new angular-module创建一个全新的angular应用,默认不选路由 ②通过一下命令分别创建2个模块和1个组件 ng g m hx1 ng g c hx1 ng g m hx ...

  3. Angular:组件之间的通信@Input、@Output和ViewChild

    ①父组件给子组件传值 1.父组件: ts: export class HomeComponent implements OnInit { public hxTitle = '我是首页的头部'; con ...

  4. 【Django Python版本对应】

    使用Python36 时应该使用Django版本1.11.4 pip install django==1.11.4 版本对应表: Django version Python versions 1.8 ...

  5. 容器编排系统之Pod资源配置清单基础

    前文我们了解了k8s上的集群管理工具kubectl的基础操作以及相关资源的管理,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/14130540.html:今天我 ...

  6. Springboot mini - Solon详解(七)- Solon Ioc 的注解对比Spring及JSR330

    Springboot min -Solon 详解系列文章: Springboot mini - Solon详解(一)- 快速入门 Springboot mini - Solon详解(二)- Solon ...

  7. 最详细10招Spark数据倾斜调优

    最详细10招Spark数据倾斜调优 数据量大并不可怕,可怕的是数据倾斜 . 数据倾斜发生的现象 绝大多数 task 执行得都非常快,但个别 task 执行极慢. 数据倾斜发生的原理 在进行 shuff ...

  8. webpack配置css-loader

    执行 npm init 命令 生成 package.json 文件 在 webstorm 项目中局部安装 webpack(比如安装3.6.0版本) npm install webpack@3.6.0 ...

  9. 网页客服思路以及QQ截图粘贴到聊天框功能

    功能: 1.客服需登录进入客服页面.用户无需登录,进入用户页面,直接获取sessionId作为id值. 2.用户进入页面并且发送消息时,客服才会获取到该用户,并在左侧列表显示. 3.点击用户名即可切换 ...

  10. python初学者-从小到大排序

    x=input("x=") y=input("y=") z=input("z=") if x>y: x,y=y,x if x>z ...