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跨平台或扫描二维码关注

ASP.NET Core MVC I\/O编程模型相关推荐

  1. ASP.NET Core MVC 模型绑定用法及原理

    前言 查询了一下关于 MVC 中的模型绑定,大部分都是关于如何使用的,以及模型绑定过程中的一些用法和概念,很少有关于模型绑定的内部机制实现的文章,本文就来讲解一下在 ASP.NET Core MVC ...

  2. 通过极简模拟框架让你了解ASP.NET Core MVC框架的设计与实现[上篇]

    <200行代码,7个对象--让你了解ASP.NET Core框架的本质>让很多读者对ASP.NET Core管道有了真实的了解.在过去很长一段时间中,有很多人私信给我:能否按照相同的方式分 ...

  3. 【18】ASP.NET Core MVC 中的 Model介绍

    ASP.NET Core MVC 中的 Model 在本视频中,我们将通过一个示例讨论 ASP.NET Core MVC 中的 Model. 我们希望最终从 Student 数据库表中查询特定的学生详 ...

  4. ASP.NET Core MVC 视图

    ASP.NET Core MVC中视图的知识和ASP.NET MVC有很多相似之处,学习难度较低.以下内容主要体现了编程中模块化的思想,模块化才应是我们关注的重点. 布局用于提供各个页面所需的公共部分 ...

  5. 《从零开始学ASP.NET CORE MVC》课程介绍

    大家好,欢迎来到52ABP学院,收看我们的 <从零开始学ASP.NET CORE MVC>. ASP.NET Core 简介 从2015年开始随时互联网成长,云计算和AI.大数据的爆发,大 ...

  6. 为什么 web 开发人员需要迁移到. NET Core, 并使用 ASP.NET Core MVC 构建 web 和 API

    2018 .NET开发者调查报告: .NET Core 是怎么样的状态,这里我们看到了还有非常多的.net开发人员还在观望,本文给大家一个建议.这仅代表我的个人意见, 我有充分的理由推荐.net 程序 ...

  7. Pro ASP.NET Core MVC(四)【C#关键特征】

    在本章中,我描述了Web应用程序开发中使用的C#特征,这些特征尚未被广泛理解或经常引起混淆. 这不是关于C#的书,但是,我仅为每个特征提供一个简单的例子,以便您可以按照本书其余部分的示例,并在自己的项 ...

  8. 这本694页的程序员砖头书让你精通ASP.NET Core MVC

    ASP.NET Core MVC是一个来自微软的Web应用程序开发框架,它结合了模型-视图-控制器(MVC)体系结构的有效性和整洁性.敏捷开发的想法和技术,以及.NET平台的最佳部分. 1.1 ASP ...

  9. ASP.NET Core MVC 和 EF Core 教程 - 创建、读取、更新和删除

    作者:Tom Dykstra 和 Rick Anderson Contoso 大学示例 web 应用程序演示如何使用 Entity Framework Core 和 Visual Studio 创建 ...

最新文章

  1. 瑞星播报:3月8日需警惕“灰鸽子变种AWM”病毒
  2. tftp刷路由器 linux,TP-Link无线路由器HTTP/TFTP后门漏洞
  3. [原创].NET 业务框架开发实战之九 Mapping属性原理和验证规则的实现策略
  4. TIOBE 10月编程语言排行榜 : GO 问鼎本年度语言 ?
  5. Python运算符 - Python零基础入门教程
  6. 浅谈HotSpot逃逸分析
  7. File类的一些方法测试
  8. php 网页对话框插件,JavaScript_jquery插件hiAlert实现网页对话框美化,厌烦了IE浏览器的警告窗,伴 - phpStudy...
  9. 动态MAC地址和静态MAC地址
  10. podman 开机自启
  11. 解读百度权重是怎么计算的
  12. Java的MessageDigest类、MD5算法
  13. 马氏距离(Mahalanobis Distance)介绍与实例
  14. 我要大学答案-大学生都在用的小程序 课后习题答案|实验报告|考研资料|期末真题~
  15. Vue 2.0 起步(2) 组件及 vue-router实例 - 微信公众号RSS
  16. 环球好货,小黑鱼就是一个骗局
  17. 二项式反演(学习笔记)
  18. MATLAB代码:基于多目标粒子群算法冷热电联供综合能源系统运行优化
  19. 帝国cms的下载地址点击直接下载而不用跳转的设置方法
  20. 上古卷轴3晨风职业_《上古卷轴》全系列回顾及剧情简介

热门文章

  1. VNX NETAPP NAS 备份恢复
  2. 5.03 列出表的索引
  3. 运营商在万物互联扮演什么角色?上海联通NB-IoT奠定基础
  4. 带有帐号密码验证的apche服务器文件下载
  5. MVC捕获数据保存时的具体字段验证错误代码
  6. Linux下查看进程对应的命令绝对路径
  7. Linux配置sudo
  8. 关于c/c++/obj-c的混合使用 (2010-06-22 10:05:33)
  9. C# 线程问题之争用条件
  10. .NET6之MiniAPI(十八):OpenAPI swagger