ASP.NET教程之利用Async和Await的价值仓酷云
今天去面试,被问到C#中的new关键字,看了那么多的书对new关键字还是有一定认识,回来又把new复习了一遍,发现了许多以前还不知道的细节。异步手艺能使得使用程序的总吞吐量失掉明显提拔,但这并非无偿的。异步函数常常比其同步替换计划稍慢一些,并且假如您不介怀接纳它还会增添相称年夜的内存压力的话。StephenToub比来在MSDN杂志中一篇题为“异步功能:懂得Async和Await的价值”的文章中会商了该主题。相对本机C++代码而言,托管代码最明显的上风之一就是运转时内联函数(inlinefunction)的才能。CLR的JIT编译器乃至能够跨程序集内联函数,从而年夜年夜下降了挪用细粒度办法(OOP程序员偏幸此类办法)的开支。不幸的是,异步伐用的实质意味着不克不及内联托付(delegatescannotbeinlined)。别的,在创建异步伐用时还包含很多榜样代码。因而,这招致了Stephen的第一条倡议,“思索粗粒度,而非细粒度(ThinkChunky,NotChatty)”。就像你正在穿越某个COM或p/invoke界限一样,相对很多的小型异步伐用而言,你应当会更喜好多数的年夜型异步伐用。
异步形式下无需开辟者显式利用new运算符,便可经由过程多种体例分派内存。假如任其开展,这些内存分派法大概招致过年夜的内存压力,而且因为渣滓接纳器实验跟进还会招致不用要的提早。思索来自Stream子类的这个署名及其前往语句:
publicoverrideasyncTask<int>ReadAsync(…)returnthis.Read(…)此处没有展现隐式创立Task对象,该对象用于包装从Read办法中前往的整型值。在Stephen的文章中,他展现了怎样经由过程缓存比来的Task<int>对象及重用该对象来下降内存开支。
招致不测对象分派和保存的另外一缘故原由是利用闭包(closures)。C#和VB中的闭包是经由过程匿名类来完成的,匿名类包括匿名办法,并且在办法中声了然异步函数。那些匿名函数所需的当地变量听说被“关闭”(closedover)或“提拔”(lifted)到该匿名类中。当每次挪用匿名类的父办法时都必需创立一个该类实例。
成绩并未就此停止,仍有大概使得分外的内存分派进一步好转。一般情形下,部分变量所援用的对象是被热切哀求的,渣滓接纳器(GC)一旦明白那些部分变量在以后函数中将不再被利用时就会接纳它们。因为在异步函数中所利用的“部分变量”实践上是某个匿名类中的字段,因而在挪用时代它们必需被保存。假如此历程耗时数秒,这关于异步伐用而言是很罕见的,而该匿名类大概在不经意间被提升为渣滓接纳器中更高贵的1代或2代对象。假如这成为成绩,Stephen倡议一旦不再必要那些部分变量就应显式地把它们设置为空援用。
Stephen所会商的第三个成绩是高低文的观点,出格是同步高低文(synchronizationcontext)和实行高低文(executioncontext)。他在文章中展现了库代码怎样经由过程利用ConfigureAwait办法存心疏忽同步高低文、和制止某些必需在实行高低文中捕捉的事变来取得功能提拔的举措。
译注
内联函数(inlinefunction),在分歧的编程言语中,内联函数(inlinefunction)是指已请求编纂器对其实行内联睁开(inlineexpansion)的函数。换言之,程序员已请求编译器将每处挪用某函数的中央都拔出完全的函数体,而不是天生代码以便从其界说的中央挪用该函数。可使用C99或C++编写内联函数,比方:
inlineintmax(inta,intb){return(a>b)?a:b;}然后,挪用语句以下:
a=max(x,y);该语句在编译后,大概被转换成为更间接的盘算:
a=(x>y)?x:y;详见Inlinefunction。
思索粗粒度,而非细粒度(ThinkChunky,NotChatty),Chunky与Chatty之争此前多见于“服务协议计划”(servicecontractdesign)。絮聒的服务(ChattyService)趋势于前往简化信息,并利用更细粒度的操纵。矮胖的服务(ChunkyService)趋势于前往庞大条理信息,并利用粗粒度的操纵。换言之,两者分歧的地方在于,当前往一样的信息时,絮聒的服务与矮胖的服务比拟则必要更多的挪用,却增添了前往实践必要的得当信息的天真性。详见WCFservicecontractdesign。
1代或2代对象,“代”是渣滓接纳器用到的观点。提到渣滓接纳器就不能不说“托管堆的简化模子”,该模子的划定规矩以下:
[*]一切可举行渣滓接纳的对象都分派在一个一连的地点空间局限(托管堆)内。
[*]堆被分别为代(generation),以便只需查找堆的一小部分就可以扫除年夜多半渣滓。
[*]代中的对象大致上均为同龄。
[*]代的编号越高,暗示堆的这一片地区所包括的对象越老——这些对象就越有多是不乱的。最老的对象位于最低的地点内,而新的对象则创立在增添的地点内。
[*]新对象的分派指针标志了内存的已利用(已分派)内存地区和未利用(可用)内存地区之间的界限。
[*]经由过程删除逝世对象并将活对象转移到堆的低地点开端,堆周期性地举行紧缩。这就扩大了在创立新对象的图表底部的未利用地区。
[*]对象在内存中的按次仍旧是创立它们的按次,以便于定位。
[*]在堆中,对象之间永久不会有任何清闲。
[*]只要某些可用空间是已提交的。必要时,操纵体系会从“保存的”地点局限平分配更多的内存。
详见“渣滓接纳器基本与功能提醒”。
检察英文原文:TheCostofAsyncandAwait
译者高翌翔基于.NET平台举行Web使用程序计划、开辟,存眷急迅开辟和架构计划,及各类进步代码可保护性的最好理论。
J2EE比较成熟一点,一些比较出名的企业应用软件都是基于J2EE的。以后的发展就不好说了。不过net网页编程比较烦,学.net的话,微软把很多工具都封装好了,学起来可能容易一点。 代码逻辑混乱,难于管理:由于ASP是脚本语言混合html编程,所以你很难看清代码的逻辑关系,并且随着程序的复杂性增加,使得代码的管理十分困难,甚至超出一个程序员所能达到的管理能力,从而造成出错或这样那样的问题。 主流网站开发语言之CGI:CGI就是公共网关接口(CommonGatewayInterface)的缩写。它是最早被用来建立动态网站的后台技术。这种技术可以使用各种语言来编写后台程序,例如C,C++,Java,Pascal等。 JSP/Servlet虽然在国内目前的应用并不广泛,但是其前途不可限量。 主流网站开发语言之ASP:ASP是微软(Microsoft)所开发的一种后台脚本语言,它的语法和VisualBASIC类似,可以像SSI(ServerSideInclude)那样把后台脚本代码内嵌到HTML页面中。虽然ASP简单易用,但是它自身存在着许多缺陷,最重要的就是安全性问题。 我的意思是.net好用,从功能上来说比JAVA强还是很明显的。 主流网站开发语言之CGI:CGI就是公共网关接口(CommonGatewayInterface)的缩写。它是最早被用来建立动态网站的后台技术。这种技术可以使用各种语言来编写后台程序,例如C,C++,Java,Pascal等。 目前在微软的.net战略中新推出的ASP.net借鉴了Java技术的优点,使用CSharp(C#)语言作为ASP.net的推荐语言,同时改进了以前ASP的安全性差等缺点。但是,使用ASP/ASP.net仍有一定的局限性,因为从某种角度来说它们只能在微软的WindowsNT/2000/XP+IIS的服务器平台上良好运行(虽然像ChilliSoft提供了在UNIX/Linux上运行ASP的解决方案. 最强的技术支持WebService,而且有.NET的所有library做后盾。而且ASP.NET在.NET3.5中还有微软专门为AJAX开发的功能--ASP.NETAJAX。 它可通过内置的组件实现更强大的功能,如使用A-DO可以轻松地访问数据库。 Asp.net:首先来说,Asp.net和Asp没什么关系,看着像是升级版本什么的,其实没什么联系。Asp是脚本编程,用的是ASP语言,而ASP.net用的是C#语言,完全不同的东西。
页:
[1]