ASP.NET Core MVC I\/O编程模型

1.1. I/O编程模型浅析

服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种:

(1)同步阻塞IO(Blocking IO):即传统的IO模型。

(2)同步非阻塞IO(Non-blocking IO):默认创建的socket都是阻塞的,非阻塞IO要求socket被设置为NONBLOCK。

(3)IO多路复用(IO Multiplexing):即经典的Reactor设计模式,有时也称为异步阻塞IO,Java中的Selector和Linux中的epoll都是这种模型。

(4)异步IO(Asynchronous IO):即经典的Proactor设计模式,也称为异步非阻塞IO。

同步和异步的概念描述的是用户线程与内核的交互方式:

  • 同步是指用户线程发起IO请求后需要等待或者轮询内核IO操作完成后才能继续执行;

  • 异步是指用户线程发起IO请求后仍继续执行,当内核IO操作完成后会通知用户线程,或者调用用户线程注册的回调函数。

阻塞和非阻塞的概念描述的是用户线程调用内核IO操作的方式:

  • 阻塞是指IO操作需要彻底完成后才返回到用户空间;

  • 非阻塞是指IO操作被调用后立即返回给用户一个状态值,无需等到IO操作彻底完成。


1.2. 同步阻塞I/O

同步阻塞I/O模型是最简单的I/O模型,用户进程在进行I/O操作时被阻塞,如下图所示:


在ASP.NET Core中没有使用多线程或加入异步关键字的模型均为同步阻塞I/O

public IActionResult Sync()        {      
var start = DateTime.Now;Add();        
return Json("start:"+start+"||| end:" + DateTime.Now);}          
void Add()        {Thread.Sleep(2000);Console.WriteLine(DateTime.Now);    
}

1.3. 同步非阻塞I/O

在同步非阻塞整个IO请求的过程中,虽然用户线程每次发起IO请求后可以立即返回,但是为了等到数据,仍需要不断地轮询、重复请求,消耗了大量的CPU的资源。一般很少直接使用这种模型,而是在其他IO模型中使用非阻塞IO这一特性

在ASP.NET Core 中可以使用多线程来实现同步非阻塞,在如下代码清单中可以看到,使用多线程调用一个会自动休眠2秒的方法,主线程Sync会先返回值,而不会阻塞。

public IActionResult Sync()    {      var thread = new Thread(new ThreadStart(this.Add));thread.Start();        return Json(DateTime.Now);}   
void Add()    {Thread.Sleep(2000);Console.WriteLine(DateTime.Now);}

而子线程由于被阻塞了2秒,因此时间为:

如果想在同步非阻塞的情况下获得返回的数据,就需要轮询,重复的对线程请求。代码清单中使用while循环轮询线程。

public IActionResult Sync()    {    
short num = 10;      var thread = new Thread(new ParameterizedThreadStart(this.Add));thread.Start(num);     while (thread.IsAlive) ;      return Json(DateTime.Now + "result:" + result);}    
void Add(object num)    {Thread.Sleep(2000);        this.result =(short)num ;Console.WriteLine(DateTime.Now);}


1.4. 异步I/O

真正的异步IO需要操作系统更强的支持。在异步IO模型中,当用户线程收到通知时,数据已经被内核读取完毕,并放在了用户线程指定的缓冲区内,内核在IO完成后通知用户线程直接使用即可。

public IActionResult Async()    {      
var start = DateTime.Now;    
     short num = 10;     var result = Add(num).Result;      
      return Json("start:"+ start +" end: " +  DateTime.Now + " ||| result: " + result);}    
   
   async Task<short> Add(short num)    {      
     await Task.Delay(2000);        return ++num;}

关于异步的更详细的使用可参看 http://www.cnblogs.com/vipyoumay/p/5663950.html


1.5. 总结

1.同步与异步关注的是消息通信机制 (synchronous communication/ asynchronous communication)

所谓同步,就是在发出一个 调用 时,在没有得到结果之前,该调用就不返回。但是一旦调用返回,就得到返回值了。换句话说,就是由调用者主动等待这个调用的结果。而异步则是相反,调用在发出之后,这个调用就直接返回了,所以没有返回结果。换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果。而是在调用发出后,被调用者通过状态、通知来通知调用者,或通过回调函数处理这个调用。

你打电话问书店老板有没有《分布式系统》这本书,如果是同步通信机制,书店老板会说,你稍等,”我查一下",然后开始查啊查,等查好了(可能是5秒,也可能是一天)告诉你结果(返回结果)。而异步通信机制,书店老板直接告诉你我查一下啊,查好了打电话给你,然后直接挂电话了(不返回结果)。然后查好了,他会主动打电话给你。在这里老板通过“回电”这种方式来回调。

2. 阻塞与非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态.

阻塞调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。

你打电话问书店老板有没有《分布式系统》这本书,你如果是阻塞式调用,你会一直把自己“挂起”,直到得到这本书有没有的结果,如果是非阻塞式调用,你不管老板有没有告诉你,你自己先一边去玩了, 当然你也要偶尔过几分钟check一下老板有没有返回结果。在这里阻塞与非阻塞与是否同步异步无关。跟老板通过什么方式回答你结果无关


【1】http://www.jianshu.com/p/77332a3b07b5

【2】http://kb.cnblogs.com/page/85931

【3】https://www.zhihu.com/question/19732473

相关文章: 

  • .NET Core 2.0 正式发布信息汇总

  • .NET Standard 2.0 特性介绍和使用指南

  • .NET Core 2.0 的dll实时更新、https、依赖包变更问题及解决

  • .NET Core 2.0 特性介绍和使用指南

  • Entity Framework Core 2.0 新特性

  • 体验 PHP under .NET Core

  • .NET Core 2.0使用NLog

  • 升级项目到.NET Core 2.0,在Linux上安装Docker,并成功部署

  • 解决Visual Studio For Mac Restore失败的问题

  • ASP.NET Core 2.0 特性介绍和使用指南

  • .Net Core下通过Proxy 模式 使用 WCF

  • .NET Core 2.0 开源Office组件 NPOI

  • ASP.NET Core Razor页面 vs MVC

  • Razor Page–Asp.Net Core 2.0新功能  Razor Page介绍

  • MySql 使用 EF Core 2.0 CodeFirst、DbFirst、数据库迁移(Migration)介绍及示例

  • .NET Core 2.0迁移技巧之web.config配置文件

  • asp.net core MVC 过滤器之ExceptionFilter过滤器(一)

  • ASP.NET Core 使用Cookie验证身份

  • ASP.NET Core MVC – Tag Helpers 介绍

  • ASP.NET Core MVC – Caching Tag Helpers

  • ASP.NET Core MVC – Form Tag Helpers

  • ASP.NET Core MVC – 自定义 Tag Helpers

  • ASP.NET Core MVC – Tag Helper 组件

  • ASP.Net Core Razor 页面路由

  • 粗略使用.NetCore2.0自带授权登陆Authorize

  • ASP.NET Core 2.0 自定义 _ViewStart 和 _ViewImports 的目录位置

原文地址:http://www.cnblogs.com/vipyoumay/p/7487389.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/323729.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

几天没写代码,就……

“大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂”前言现在是2022年2月1日21:07:37&#xff0c;今天是农历2022年的第一天&#xff0c;祝大家虎年大吉&#xff0c;新的一年里身体健康&#xff0c;事业有成&#xff01;&#xff01;&#…

深入浅出 Java CMS 学习笔记

转载自 深入浅出 Java CMS 学习笔记 引子 带着问题去学习一个东西&#xff0c;才会有目标感&#xff0c;我先把一直以来自己对CMS的一些疑惑罗列了下&#xff0c;希望这篇学习笔记能解决掉这些疑惑&#xff0c;希望也能对你有所帮助。 1、 CMS出现的初衷、背景和目的&#x…

P1352-没有上司的舞会【树形dp】

正题 评测记录:https://www.luogu.org/recordnew/lists?uid52918&pidP1352 题目大意 一棵树&#xff0c;如果选择了子节点那么就不能选择父节点&#xff0c;如果选择了父节点那么就不能选择子节点。 求选择的点的最大权值和。 解题思路 和最大利润类似。 code #inclu…

vue利用级联选择器实现全国省市区乡村五级菜单联动

“大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂。”现在是&#xff1a;2022年2月13日20:09:27今天分享一个五级级联地址的组件的使用吧。前言接到这样的一个需求&#xff1a;需要根据地址查询列表信息&#xff0c;地址可以分别按照省、市…

业务库负载翻了百倍,我做了什么来拯救MySQL架构

转载自 业务库负载翻了百倍&#xff0c;我做了什么来拯救MySQL架构 作者介绍 杨建荣&#xff0c;竞技世界资深DBA&#xff0c;前搜狐畅游数据库专家&#xff0c;Oracle ACE&#xff0c;YEP成员。拥有近十年数据库开发和运维经验&#xff0c;目前专注于开源技术、运维自动化和…

NuGet.org服务管理变更,提升中国用户体验

.NET的软件包管理器NuGet.org是一项面向全球用户搭建的服务&#xff0c;不论用户身在何处&#xff0c;NuGet.org都应该有能力提供高性能的服务。但在实际使用中&#xff0c;我们发现它的表现并不总能如人所愿&#xff0c;特别是在拥有全球第二大.NET开发者社区的中国&#xff0…

vue中父组件怎么调用子组件

前言 前段时间&#xff0c;写了个地址的控件&#xff0c;封装成了一个子组件&#xff0c;在其他页面共用。 原文地址&#xff1a;vue利用级联选择器实现全国省市区乡村五级菜单联动 然后当时出现了个bug&#xff0c;也没有太注意&#xff0c;后来才发现的。就是重置不了地址栏…

POJ3585-Accumulation Degree【树形dp,二次扫描与换根法】

正题 题目链接:http://poj.org/problem?id3585 题目大意 有棵无根树&#xff0c;当你选择一个点为根时&#xff0c;价值就是根节点到所有叶节点的路上的最小权值之和。 解题思路 我们可以先计算一次点1为根时的答案&#xff0c;路上统计答案为didi&#xff0c;然后定义fifi…

ASP.NET Core 运行原理解剖[4]:进入HttpContext的世界

本系列文章从源码分析的角度来探索 ASP.NET Core 的运行原理&#xff0c;分为以下几个章节&#xff1a; ASP.NET Core 运行原理解剖[1]:Hosting ASP.NET Core 运行原理解剖[2]:Hosting补充之配置介绍 ASP.NET Core 运行原理解剖[3]:Middleware-请求管道的构成 IHttpContext…

都忘了自己还有一套房子了。。。

​自20年始来&#xff0c;一直租着我的房子。当时疫情刚刚有所好转&#xff0c;我把房子挂在58上&#xff0c;陆陆续续的有好多人问&#xff0c;不过都没有租&#xff0c;一来离我住的地方有点远&#xff0c;过去一次得个把小时的&#xff0c;人家要看房子不能及时过去。二来问…

JavaFX鼠标拖拽事件

一、节点原拖拽事件 //鼠标拖拽进入node node.setOnMouseDragEntered(event->{//do something });//鼠标拖拽退出node node.setOnMouseDragExited(event->{//do something });//鼠标拖拽经过node&#xff08;入-出&#xff09; node.setOnMouseDragOver(event->{//do…

POJ2228-Naptime【环形结构上的dp】

正题 题目链接:http://poj.org/problem?id2228 题目大意 有一个环&#xff0c;选择一段长度为n进行计算。如果第i个时间点选择不睡觉那么就会增加aiai。你也可以选择睡觉&#xff0c;第一个时间点不算&#xff0c;睡觉时间至少为m。 解题思路 我们可以分为两种情况&#xf…

发现了个神奇的事儿

今天&#xff0c;我发现了个神奇的事儿。当你不想做某件事的时候&#xff0c;你会发现在做这件事之前有好多事需要“紧急”去做&#xff0c;导致最后你“没空”去做这件事&#xff01;举个例子&#xff01;比如我今天晚上不想写代码&#xff0c;于是下班回家一进门&#xff0c;…

JavaFX鼠标点击事件

一、节点原点击事件 //鼠标点击按压 node.setOnMousePressed(event->{//do something });//鼠标点击释放 node.setOnMouseReleased(event->{//do something });//鼠标点击&#xff08;按压-释放&#xff09; node.setOnMouseClicked(event->{//do something }); 二、…

Visual Studio2017 远程调试 Remote Debugger

前言 大家在使用vs打包后的文件部署到服务器后&#xff0c;有时候我们需要对线网的后台进行调试。但是它不像在VS中。这个时候我们该怎么调试呢&#xff1f; 微软想到了这一点&#xff0c;他们在 VS 中给我们提供了一个功能: Remote Debugger&#xff0c;要远程调试我们就需要…

Ch5501-环路运输【环形处理dp】

正题 题目链接:http://contest-hunter.org:83/contest/0x50%E3%80%8C%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92%E3%80%8D%E4%BE%8B%E9%A2%98/5501%20%E7%8E%AF%E8%B7%AF%E8%BF%90%E8%BE%93 题目大意 有n座仓库&#xff0c;然后是一个环&#xff0c;两个仓库之间的运输距离为AiAj…

JavaFX鼠标移动事件

一、节点原鼠标移动事件 //鼠标进入node node.setOnMouseEntered(event->{//do something });//鼠标退出node node.setOnMouseExited(event->{//do something });//鼠标移动 node.setOnMouseMoved(event->{//do something }); 二、节点监听鼠标移动事件 //鼠标进入 …

对于这款APP,我充了个终身VIP!!!

“大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂。”现在是&#xff1a;2022年3月15日00:02:07昨天&#xff0c;无意间知道了一款特牛的APP&#xff0c;看了看&#xff0c;决定充了个终身会员&#xff01;今天&#xff0c;我就简单的对这…

Ubuntu amp;amp; GitLab CI amp;amp; Docker amp;amp; ASP.NETnbs

上一篇&#xff1a;Ubuntu & GitLab CI & Docker & ASP.NET Core 2.0 自动化发布和部署&#xff08;1&#xff09; 服务器版本 Ubuntu 16.04 LTS。 本篇博文目的&#xff1a;项目中添加Dockerfile文件&#xff0c;使用 CI 脚本构建自定义镜像&#xff0c;推送到 …

POJ2411-Mondriaan's Dream【状态压缩dp】

正题 题目链接:http://poj.org/problem?id2411 题目大意 有nmnm的矩阵&#xff0c;用1212的方块填满有多少种方法。 解题思路 用1表示竖着的块的上面&#xff0c;其他都是0。 我们先计算出所有单排合法状态&#xff08;横着的都是连续的偶数&#xff09;。 然后我们用sta…