仓酷云

标题: ASP.NET网页设计利用并发与和谐运转时仓酷云 [打印本页]

作者: 透明    时间: 2015-1-18 11:21
标题: ASP.NET网页设计利用并发与和谐运转时仓酷云
它有很多缺点的,有兴趣可以到网上去搜索一下。于是微软有发明了“下一代”C++:C++/CLI语言,这个可以解决在.NETFramework中,托管C++产生的问题。在《程序员》杂志上,lippman和李建中合作连载介绍了C++/CLI语言。先容

并发与和谐运转时(ConcurrencyandCoordinationRuntime,CCR)是一个.NET平台上的异步信息传送类库,供应了一套微小而壮大的基本功效,可以利用分歧的体例来构造使用程序。使用程序经由过程无效利用CCR能够取得更好的呼应才能,和更好的伸缩性及容错性。而它最奇妙的中央则在于,开辟职员取得这些便当的同时,还削减(乃至完整打消)了对线程、锁、互斥体(mutex)或其他同步元素的间接操纵(或捕捉毛病)。
假如您的使用程序是单线程的,CCR可使您的程序进步呼应才能,而且更充实使用CPU中心——同时让您的代码库从观点上坚持整齐。假如您的程序已启用了多线程,那末CCR可以在简化您代码库的同时,坚持(乃至改善)程序的吞吐量。
复杂说来,CCR供应了以下功效:

经由过程“异步动静传送”机制,我们的组件经由过程发送数据的体例与另外一个组件举行通讯,更值得一提的是,数据与后续复兴没有断定的一时干系。一个已发送的动静大概必要在将来某个时分才会失掉处置,也只要到谁人时分动静才会失掉复兴。
这类异步动静传送模子是年夜部分情形下跨历程(inter-process)盘算的基本,不外与之比拟,在实际使用中利用CCR来举行地道的历程外部(intra-process)通讯常常能够失掉更好的包管,不像前者在良多情形下都大概失利。因而,CCR不但能够用于初级I/O操纵,关于构建伸缩性强的散布式体系也能够供应很好的帮助。
CCR的基本范例

CCR由几种基本范例构成:
懂得了这些基础观点以后,我们来看一些复杂的CCR代码。起首,我们来界说一个复杂的C#把持台使用程序,它会用来运转一切的示例。注重在这个程序中,我们利用了CCR自界说的线程池(Dispatcher)并与我们的义务行列绑定。这意味着行列中义务会被自界说线程池中的线程实行。
  1. staticvoidMain(string[]args){using(vardr=newDispatcher()){using(vartaskQueue=newDispatcherQueue("samples",dr)){//Exampleswillgohere...//Needablockingcalltopreventtheapplication//exiting.Console.ReadLine();}}}
复制代码
只管示例中只利用了一个义务行列,可是在实践使用中仍是倡议利用多个行列。CCR在猎取义务时会利用轮询战略来会见多个义务行列,制止任何一个行列处于饥饿形态。
起首,我们间接把一个义务放进行列。这是CCR中实行一个义务最复杂的办法,我们这里连端口都没有效到。Arbiter类包括了一系列简化开辟的办法,比方FromHandler间接从一个托付对象来创立义务——在这里我们利用匿名办法来构建该对象。如许义务就被放进了义务行列,能够由分发器来实行了。
  1. //EnqueueataskdirectlytaskQueue.Enqueue(Arbiter.FromHandler(()=>Console.WriteLine("Hello,world.")));
复制代码
年夜多半情形下我们不太会云云间接地向行列中放进义务,一样平常来讲总有一个端口在事情。鄙人一段代码中,我们会界说一个端口,一个仲裁器,然后向端口里发送动静。这个示例中我们利用String强范例的端口,如许托付的署名也必要承受一个字符串。
  1. //Postamessagetoaporttoscheduleatask.varport=newPort<string>();Arbiter.Activate(taskQueue,port.Receive(Console.WriteLine));port.Post("Hello(again),world");
复制代码
这里产生了一些不那末复杂的工具,必要花一点工夫才干懂得全部历程。port.Receive()挪用创立了一个多是最简的仲裁器,大概说是一个“承受者”,一个动静到达端口时它即会失效。动静抵达以后,便会创立一个义务,这个义务的功效是挪用托付对象,并利用方才的动静作为参数。Arbiter.Activate()挪用将创立的义务和特定的义务行列绑定在一同。
要了解CCR仲裁器,最关头的一点是它们永久不会堵塞线程。一旦吸收器没法取得数据时,线程就会被开释,可用于处置其他正在守候的义务。
仲裁器能够在任什么时候间创立,这是CCR中一个主要的观点。因而,以下所示,即便我们把下面示例中最初两行代码的序次互换,其效果也是一样的。
  1. //Postamessagetoaporttoscheduleatask.varport=newPort();port.Post("Hello(again),world");Arbiter.Activate(taskQueue,port.Receive(Console.WriteLine));
复制代码
如今我们来少量修正一下示例——我们向端口中放进两条动静再使吸收器失效,来看看会产生甚么……
  1. //Postamessagetoaporttoscheduleatask.varport=newPort();port.Post("Hello(again),world");port.Post("Hello(thrice),world");Arbiter.Activate(taskQueue,port.Receive(Console.WriteLine));
复制代码
如今假如您运转程序,就会发明只打印了一条动静。这是由于port.Receive()挪用是一个扩大办法,它简化了以下语法,可是其实不完整相称:
  1. Arbiter.Activate(taskQueue,Arbiter.Receive(false,port,Console.WriteLine));
复制代码
这里最为关头的是传送给Arbiter.Receive()挪用的第一个(Boolean)参数。它标明这个吸收器是一时的,处置完一条动静后就会丢弃。假如我们但愿处置一切到达该端口的动静,我们能够将这个参数设为true。
  1. //Postamessagetoaporttoscheduleatask.varport=newPort();port.Post("Hello(again),world");port.Post("Hello(thrice),world");Arbiter.Activate(taskQueue,Arbiter.Receive(true,port,Console.WriteLine));
复制代码
下面的代码偶然候会打印出奇异的了局——两行内容的按次纷歧致了。这事实是怎样回事呢?
在CCR中,一旦某个仲裁器(这里是个“承受”操纵)被满意以后,它会创立一个义务来处置相干动静。除非这个仲裁器被嵌套在另外一个更年夜的组合内,这些义务城市被放进义务行列中守候实行。在我们下面的示例中,这个耐久地承受器会当即分离为两条动静发生一个义务。当存在可用线程的时分,这两个义务将并发被处置,因而其实不包管二者的按次。
CCR线程池的完成与CLR线程池有几点分歧。最主要的一点是它包括流动数目的线程,这在创立时便断定上去。假如线程实行的操纵不会堵塞,那末就不会有甚么成绩。可是假如您必需倡议堵塞的哀求,那仍是利用CLR线程池对义务行列举行调剂为好,由于它可以静态的增加和压缩。如许的义务行列可使用DispatcherQueue默许机关函数来创立。
有几种举措能够包管动静的按次。大概最复杂的办法就是在轮回中利用一个一时吸收器,如许就可以一次只处置一条动静。侥幸的是,CCR包括了一个叫做迭代式义务(IterativeTask)的壮大的机制,可让我们较为天然的完成这个请求。这必要利用C#迭代器功效,我们来看一个示例:
起首,我们将今朝的Arbiter.Activate交换成以下挪用:
  1. Arbiter.Activate(taskQueue,newArbiter<Arbiter<string>>(port,ProcessMessages));
复制代码
这段代码创建了一个名为ProcessMessages的迭代式义务,界说以下:
  1. staticIEnumerator<ITask>ProcessMessages(Port<string>port){while(true)yieldreturnport.Receive(Console.WriteLine);}
复制代码
这个办法为一个无穷轮回,守候(但不堵塞)承受操纵以取得满意。承受到动静时托付将被挪用,并持续轮回。假如我们但愿在端口承受到一个空字符串时跳出轮回,我们能够编写以下代码(请注重我们利用了Lambda表达式构建了一个匿名托付来处置动静):
  1. staticIEnumerator>ProcessMessages(Portport){boolfDone=false;while(!fDone){yieldreturnport.Receive(message=>{if(String.IsNullOrEmpty(message))fDone=true;elseConsole.WriteLine(message);});}Console.WriteLine("Finished");}
复制代码
迭代器是CCR工具箱中十分壮大的工具——它年夜年夜简化了按次挪用的异步操纵的编码事情,使非堵塞操纵的利用十分靠近于同步伐用体例。比方,一个级别高的义务能够前往以下的ProcessMessages():
  1. //EnqueueataskdirectlytaskQueue.Enqueue(Arbiter.FromHandler(()=>Console.WriteLine("Hello,world.")));0
复制代码
到今朝为止,我们只看到了复杂承受器的利用——当单个动静抵达单个端口时仲裁器便会布置一个义务。那末如今就能够来看一下更初级的仲裁体例了——其供应了一种黏着剂,能够将承受器举行嵌套以创建更壮大的功效。
“选择器(Choice)”是个中最经常使用的功效之一,它会从多个承受器选择一个,而且只选择个中一个承受器来处置。比方,以下迭代义务会在处置前守候一个字符串或一个旌旗灯号。
  1. //EnqueueataskdirectlytaskQueue.Enqueue(Arbiter.FromHandler(()=>Console.WriteLine("Hello,world.")));1
复制代码
选择器一样平常用于断定一个异步操纵的乐成大概失利,不外您也能够用它来选择一个或恣意数目的选择器。
端口集(PortSet)是对一个或多个自力端口的包装,使它们能作为一个全体来承受动静。一个典范的示例即是CCR中的SuccessFailurePort,它承继了PortSet。
另外一个经常使用的仲裁器是级联(Join)。它会在两个内嵌的承受器都失掉满意的情形下被激活。上面的示例便演示了这类体例:
  1. //EnqueueataskdirectlytaskQueue.Enqueue(Arbiter.FromHandler(()=>Console.WriteLine("Hello,world.")));2
复制代码
在资本无限的情形下,级联能够十分无效地把持会见。第一个端口包括了对资本的哀求,另外一个则包括了无效的资本。利用级联以后,我们能够限定哀求只在有余暇资本的时分才举行处置。另外一个初级其余仲裁体例是“交叉(Interleave)”。这在观点上与读写锁(read-writelock)较为靠近,只能在非堵塞的异步语法中利用。读取义务可以与其他读取义务同时运转,可是写进义务(它比读取的优先级高)只能在没有其他义务实行的情形下举行。以下是这类仲裁器的声明,它用于回护某种观点上的“缓存”:
  1. //EnqueueataskdirectlytaskQueue.Enqueue(Arbiter.FromHandler(()=>Console.WriteLine("Hello,world.")));3
复制代码
在这里,耐久承受器被放进符合的组中,这便入手下手了“交叉”仲裁。任何属于ConcurrentReceiverGroup()的承受器可以让联系关系的义务之间并发实行。相反,ExclusiveReceiverGroup中的承受器只能自力于其他承受器实行。别的关于放进该组的承受器,我们能够限定它们完整依照动静传送的按次来实行义务。任何属于TeardownReceiverGroup组中的承受器会在封闭“交叉”仲裁时,也就是在最初被挪用——因而如许的承受器不克不及是耐久化的。
“交叉”仲裁利用轮询的体例对各承受器举行较为公允的调剂。别的关于实行的按次,即便在ExclusiveReceiverGroup外部也是各端口自力的。关于发送至互相有关的端口的两条动静,它们的实行按次其实不确保与它们的抵达按次不异。
之条件到过,CCR迭代义务能让我们用靠近于一般堵塞式同步操纵的体例,来编写逻辑上是按次实行的非堵塞异步操纵。如许的异步操纵通常是I/O麋集型操纵,多是一个Web哀求,一个数据库操纵,或基本文件I/O等。因为如今我们能够更好地把持这些操纵,如今编写这类异步I/O操纵变得愈发复杂,而且能无效地进步使用程序的吞吐量和伸缩性。
在APM天下中毗连BeginXXX和EndXXX的主要形式为AsyncCallback托付,它的情势是:
  1. //EnqueueataskdirectlytaskQueue.Enqueue(Arbiter.FromHandler(()=>Console.WriteLine("Hello,world.")));4
复制代码
CCR便基于此,Port<IAsyncResult>的Post操纵与之恰好符合。利用这类这类体例,我们能够用以下的迭代义务举行异步文件复制:
  1. //EnqueueataskdirectlytaskQueue.Enqueue(Arbiter.FromHandler(()=>Console.WriteLine("Hello,world.")));5
复制代码
从基本上说,这些异步操纵在完成时城市向我们的端口中传送一个IAsyncResult对象。在这里,我们会守候端口的承受操纵失掉满意,这意味着异步操纵已完成,能够接着下一步持续入手下手。这完整是一个异步完成(我们完整大概利用大批的线程来实行数千个如许的操纵),可是我们这些代码的企图可谓一览无余——我们读取一块数据,再写进一块数据,重复不休直到完成。
为了使文件复制的示例尽量坚持复杂,下面的代码省略了处置非常的代码,不外健壮的代码必需可以处置读写操纵大概激发的非常。在这里没法使用一般的try/catch,由于这类非常处置体例具有线程线程相干性,而CCR义务大概被运转于任何可用的线程之上——现实上关于这类迭代义务,义务的每一个“步骤”都大概与之前在分歧的线程上实行。
在CCR中处置非常有两种基础的体例。第一种是显式地在每一个操纵中将毛病举行捕捉,并由端口授播进来。但是这会让挪用者和被挪用者两边形成可不雅的代码收缩。假如要在前例中举行显式地毛病处置,文件会见体例就会产生基本性的改动。上面的代码展现了文件读取方面必要举行的改动:
  1. //EnqueueataskdirectlytaskQueue.Enqueue(Arbiter.FromHandler(()=>Console.WriteLine("Hello,world.")));6
复制代码
很明显,这个体例非常粗笨,并且十分简单堕落——这不是代码中应当利用的做法,我们要把毛病处置路径自力出来。
值得光荣的是,CCR为毛病处置供应了一种洁净而壮大的撑持,这类机制被称作为“因果干系(Causality)”。它不但让我们的代码从显式处置非常的冗杂中开释出来,还在声明后持续坚持原有义务的实行路径。这使我们可以创建一致的毛病处置代码来应对恣意庞大的异步操纵。
创建Causality的典范体例是在初始化分发器以后为它的非常端口附加一个托付对象,以此来关照CCR处置非常的体例。
  1. //EnqueueataskdirectlytaskQueue.Enqueue(Arbiter.FromHandler(()=>Console.WriteLine("Hello,world.")));7
复制代码
如许,我们能够用一般体例创立义务或传送动静了,Causality会捕捉任何义务在实行过程当中发生的非常,并由Causality交给非常端口,并在相干的托付对象上实行。
结论

CCR使您的使用程序可以用它供应的这些体例来体现,这包含一些基本的数据依附干系,在运转时调剂数据以利用无效的CPU核。这些作法间接将您从显式的线程和锁把持中开释开来,同时让您的使用程序可以完整使用日趋壮大的多核运算资本。
注重:文章中一切概念均为作者一切,与其店主有关。
文章中的一切示例可以在运转在收费供应的“MicrosoftRoboticsDeveloperStudio2008ExpressEdition”中。请细心浏览允许协定以猎取更多信息。
本文来自:http://www.infoq.com/cn/articles/Using-CCR
我见过net网页编程运行在手机上,包括很廉价的山寨手机,但是却暂时没发现.net在手机上有什么作为。wp7可能是个转机,但是按照《net网页编程的跨平台就是一句谎言。那.net的跨平台也当之无愧是一句谎言。
作者: 小妖女    时间: 2015-1-20 21:51
ASP(ActiveServerPages)是Microsfot公司1996年11月推出的WEB应用程序开发技术,它既不是一种程序语言,也不是一种开发工具,而是一种技术框架,不须使用微软的产品就能编写它的代码。
作者: 小魔女    时间: 2015-1-30 05:52
主流网站开发语言之CGI:CGI就是公共网关接口(CommonGatewayInterface)的缩写。它是最早被用来建立动态网站的后台技术。这种技术可以使用各种语言来编写后台程序,例如C,C++,Java,Pascal等。
作者: 若相依    时间: 2015-2-1 16:22
弱类型造成潜在的出错可能:尽管弱数据类型的编程语言使用起来回方便一些,但相对于它所造成的出错几率是远远得不偿失的。
作者: 若天明    时间: 2015-2-7 08:24
HTML:当然这是网页最基本的语言,每一个服务器语言都需要它的支持,要学习,这个肯定是开始,不说了.
作者: 小女巫    时间: 2015-2-8 01:29
ASP.NET可以无缝地与WYSIWYGHTML编辑器和其他编程工具(包括MicrosoftVisualStudio.NET)一起工作。这不仅使得Web开发更加方便,而且还能提供这些工具必须提供的所有优点,包括开发人员可以用来将服务器控件拖放到Web页的GUI和完全集成的调试支持。微软为ASP.net设计了这样一些策略:易于写出结构清晰的代码、代码易于重用和共享、可用编译类语言编写等等,目的是让程序员更容易开发出Web应用,满足计算向Web转移的战略需要。
作者: 金色的骷髅    时间: 2015-2-23 21:24
是指转换后的Servlet程序代码的行数。这给调试代码带来一定困难。所以,在排除错误时,可以采取分段排除的方法(在可能出错的代码前后输出一些字符串,用字符串是否被输出来确定代码段从哪里开始出错)。
作者: 飘灵儿    时间: 2015-2-24 03:58
这也就是最近几年来随着各种新的后台技术的诞生,CGI应用在Internet上越来越少的原因。CGI方式不适合大访问量的应用。
作者: 冷月葬花魂    时间: 2015-3-13 22:07
由于CGI程序每响应一个客户就会打开一个新的进程,所以,当有多个用户同时进行CGI请求的时候,服务器就会打开多个进程,这样就加重了服务器的负担,使服务器的执行效率变得越来越低下。
作者: 飘飘悠悠    时间: 2015-3-20 19:59
通过这次激烈的讨论,我从大家身上学到了太多,开阔了眼界,不管是支持我的还是骂我的,都感谢你们。




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2