仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 943|回复: 10
打印 上一主题 下一主题

[学习教程] ASP.NET教程之利用Async和Await的价值仓酷云

[复制链接]
金色的骷髅 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:20:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
今天去面试,被问到C#中的new关键字,看了那么多的书对new关键字还是有一定认识,回来又把new复习了一遍,发现了许多以前还不知道的细节。异步手艺能使得使用程序的总吞吐量失掉明显提拔,但这并非无偿的。异步函数常常比其同步替换计划稍慢一些,并且假如您不介怀接纳它还会增添相称年夜的内存压力的话。StephenToub比来在MSDN杂志中一篇题为“异步功能:懂得Async和Await的价值”的文章中会商了该主题。
相对本机C++代码而言,托管代码最明显的上风之一就是运转时内联函数(inlinefunction)[1]的才能。CLR的JIT编译器乃至能够跨程序集内联函数,从而年夜年夜下降了挪用细粒度办法(OOP程序员偏幸此类办法)的开支。不幸的是,异步伐用的实质意味着不克不及内联托付(delegatescannotbeinlined)。别的,在创建异步伐用时还包含很多榜样代码。因而,这招致了Stephen的第一条倡议,“思索粗粒度,而非细粒度(ThinkChunky,NotChatty)”[2]。就像你正在穿越某个COM或p/invoke界限一样,相对很多的小型异步伐用而言,你应当会更喜好多数的年夜型异步伐用。
异步形式下无需开辟者显式利用new运算符,便可经由过程多种体例分派内存。假如任其开展,这些内存分派法大概招致过年夜的内存压力,而且因为渣滓接纳器实验跟进还会招致不用要的提早。思索来自Stream子类的这个署名及其前往语句:
  1. publicoverrideasyncTask<int>ReadAsync(…)returnthis.Read(…)
复制代码
此处没有展现隐式创立Task对象,该对象用于包装从Read办法中前往的整型值。在Stephen的文章中,他展现了怎样经由过程缓存比来的Task<int>对象及重用该对象来下降内存开支。
招致不测对象分派和保存的另外一缘故原由是利用闭包(closures)。C#和VB中的闭包是经由过程匿名类来完成的,匿名类包括匿名办法,并且在办法中声了然异步函数。那些匿名函数所需的当地变量听说被“关闭”(closedover)或“提拔”(lifted)到该匿名类中。当每次挪用匿名类的父办法时都必需创立一个该类实例。
成绩并未就此停止,仍有大概使得分外的内存分派进一步好转。一般情形下,部分变量所援用的对象是被热切哀求的,渣滓接纳器(GC)一旦明白那些部分变量在以后函数中将不再被利用时就会接纳它们。因为在异步函数中所利用的“部分变量”实践上是某个匿名类中的字段,因而在挪用时代它们必需被保存。假如此历程耗时数秒,这关于异步伐用而言是很罕见的,而该匿名类大概在不经意间被提升为渣滓接纳器中更高贵的1代或2代对象[3]。假如这成为成绩,Stephen倡议一旦不再必要那些部分变量就应显式地把它们设置为空援用。
Stephen所会商的第三个成绩是高低文的观点,出格是同步高低文(synchronizationcontext)和实行高低文(executioncontext)。他在文章中展现了库代码怎样经由过程利用ConfigureAwait办法存心疏忽同步高低文、和制止某些必需在实行高低文中捕捉的事变来取得功能提拔的举措。
译注
[1]内联函数(inlinefunction),在分歧的编程言语中,内联函数(inlinefunction)是指已请求编纂器对其实行内联睁开(inlineexpansion)的函数。换言之,程序员已请求编译器将每处挪用某函数的中央都拔出完全的函数体,而不是天生代码以便从其界说的中央挪用该函数。可使用C99或C++编写内联函数,比方:
  1. inlineintmax(inta,intb){return(a>b)?a:b;}
复制代码
然后,挪用语句以下:
  1. a=max(x,y);
复制代码
该语句在编译后,大概被转换成为更间接的盘算:
  1. a=(x>y)?x:y;
复制代码
详见Inlinefunction。
[2]思索粗粒度,而非细粒度(ThinkChunky,NotChatty),Chunky与Chatty之争此前多见于“服务协议计划”(servicecontractdesign)。絮聒的服务(ChattyService)趋势于前往简化信息,并利用更细粒度的操纵。矮胖的服务(ChunkyService)趋势于前往庞大条理信息,并利用粗粒度的操纵。换言之,两者分歧的地方在于,当前往一样的信息时,絮聒的服务与矮胖的服务比拟则必要更多的挪用,却增添了前往实践必要的得当信息的天真性。详见WCFservicecontractdesign。
[3]1代或2代对象,“代”是渣滓接纳器用到的观点。提到渣滓接纳器就不能不说“托管堆的简化模子”,该模子的划定规矩以下:


  • 一切可举行渣滓接纳的对象都分派在一个一连的地点空间局限(托管堆)内。
  • 堆被分别为代(generation),以便只需查找堆的一小部分就可以扫除年夜多半渣滓。
  • 代中的对象大致上均为同龄。
  • 代的编号越高,暗示堆的这一片地区所包括的对象越老——这些对象就越有多是不乱的。最老的对象位于最低的地点内,而新的对象则创立在增添的地点内。
  • 新对象的分派指针标志了内存的已利用(已分派)内存地区和未利用(可用)内存地区之间的界限。
  • 经由过程删除逝世对象并将活对象转移到堆的低地点开端,堆周期性地举行紧缩。这就扩大了在创立新对象的图表底部的未利用地区。
  • 对象在内存中的按次仍旧是创立它们的按次,以便于定位。
  • 在堆中,对象之间永久不会有任何清闲。
  • 只要某些可用空间是已提交的。必要时,操纵体系会从“保存的”地点局限平分配更多的内存。
详见“渣滓接纳器基本与功能提醒”。
检察英文原文:TheCostofAsyncandAwait
译者高翌翔基于.NET平台举行Web使用程序计划、开辟,存眷急迅开辟和架构计划,及各类进步代码可保护性的最好理论。
J2EE比较成熟一点,一些比较出名的企业应用软件都是基于J2EE的。以后的发展就不好说了。不过net网页编程比较烦,学.net的话,微软把很多工具都封装好了,学起来可能容易一点。
愤怒的大鸟 该用户已被删除
沙发
发表于 2015-1-20 20:51:41 | 只看该作者
代码逻辑混乱,难于管理:由于ASP是脚本语言混合html编程,所以你很难看清代码的逻辑关系,并且随着程序的复杂性增加,使得代码的管理十分困难,甚至超出一个程序员所能达到的管理能力,从而造成出错或这样那样的问题。
分手快乐 该用户已被删除
板凳
发表于 2015-1-30 05:00:29 来自手机 | 只看该作者
主流网站开发语言之CGI:CGI就是公共网关接口(CommonGatewayInterface)的缩写。它是最早被用来建立动态网站的后台技术。这种技术可以使用各种语言来编写后台程序,例如C,C++,Java,Pascal等。
活着的死人 该用户已被删除
地板
发表于 2015-2-1 16:06:00 | 只看该作者
JSP/Servlet虽然在国内目前的应用并不广泛,但是其前途不可限量。
再现理想 该用户已被删除
5#
发表于 2015-2-7 07:24:29 | 只看该作者
主流网站开发语言之ASP:ASP是微软(Microsoft)所开发的一种后台脚本语言,它的语法和VisualBASIC类似,可以像SSI(ServerSideInclude)那样把后台脚本代码内嵌到HTML页面中。虽然ASP简单易用,但是它自身存在着许多缺陷,最重要的就是安全性问题。
金色的骷髅 该用户已被删除
6#
 楼主| 发表于 2015-2-20 23:51:29 | 只看该作者
我的意思是.net好用,从功能上来说比JAVA强还是很明显的。
因胸联盟 该用户已被删除
7#
发表于 2015-3-6 19:07:25 | 只看该作者
主流网站开发语言之CGI:CGI就是公共网关接口(CommonGatewayInterface)的缩写。它是最早被用来建立动态网站的后台技术。这种技术可以使用各种语言来编写后台程序,例如C,C++,Java,Pascal等。
柔情似水 该用户已被删除
8#
发表于 2015-3-7 03:45:11 | 只看该作者
目前在微软的.net战略中新推出的ASP.net借鉴了Java技术的优点,使用CSharp(C#)语言作为ASP.net的推荐语言,同时改进了以前ASP的安全性差等缺点。但是,使用ASP/ASP.net仍有一定的局限性,因为从某种角度来说它们只能在微软的WindowsNT/2000/XP+IIS的服务器平台上良好运行(虽然像ChilliSoft提供了在UNIX/Linux上运行ASP的解决方案.
蒙在股里 该用户已被删除
9#
发表于 2015-3-10 13:48:31 | 只看该作者
最强的技术支持WebService,而且有.NET的所有library做后盾。而且ASP.NET在.NET3.5中还有微软专门为AJAX开发的功能--ASP.NETAJAX。
兰色精灵 该用户已被删除
10#
发表于 2015-3-11 00:57:09 | 只看该作者
它可通过内置的组件实现更强大的功能,如使用A-DO可以轻松地访问数据库。
小妖女 该用户已被删除
11#
发表于 2015-3-17 17:11:01 | 只看该作者
Asp.net:首先来说,Asp.net和Asp没什么关系,看着像是升级版本什么的,其实没什么联系。Asp是脚本编程,用的是ASP语言,而ASP.net用的是C#语言,完全不同的东西。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-24 01:43

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表