仓酷云

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

[学习教程] ASP.NET网页编程之.NET托付:一个C#睡前故事

[复制链接]
小女巫 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:34:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
如果英语好,口才好,加上女孩子的优势说不定有机会进去做做别的工具)  紧耦合
  夙昔,在北方一块奇怪的地皮上,有个工人名叫彼得,他十分勤劳,对他的老板老是唯命是从。可是他的老板是个小气的人,从不信托他人,坚定请求随时晓得彼得的事情进度,以避免他偷懒。可是彼得又不想让老板呆在他的办公室里站在面前盯着他,因而就对老板做出答应:不管什么时候,只需我的事情获得了一点停顿我城市实时让你晓得。彼得经由过程周期性地利用“带范例的援用”(原文为:“typedreference”也就是delegate??)“回调”他的老板来完成他的答应,以下:
classWorker{
publicvoidAdvise(Bossboss){_boss=boss;}
publicvoidDoWork(){
Console.WriteLine(“事情:事情入手下手”);
if(_boss!=null)_boss.WorkStarted();
Console.WriteLine(“事情:事情举行中”);
if(_boss!=null)_boss.WorkProgressing();
Console.WriteLine("“事情:事情完成”");
if(_boss!=null){
intgrade=_boss.WorkCompleted();
Console.WriteLine(“工人的事情得分=”+grade);
}
}
privateBoss_boss;
}
classBoss{
publicvoidWorkStarted(){/*老板不体贴。*/}
publicvoidWorkProgressing(){/*老板不体贴。*/}
publicintWorkCompleted(){
Console.WriteLine(“工夫差未几!”);
return2;/*总分为10*/
}
}
classUniverse{
staticvoidMain(){
Workerpeter=newWorker();
Bossboss=newBoss();
peter.Advise(boss);
peter.DoWork();
Console.WriteLine(“Main:工野生作完成”);
Console.ReadLine();
}
}
  接口
  如今,彼得成了一个特别的人,他不仅能容忍小气的老板,并且和他四周的宇宙也有了亲切的接洽,以致于他以为宇宙对他的事情进度也感乐趣。不幸的是,他必需也给宇宙增加一个特别的回调函数Advise来完成同时向他老板和宇宙呈报事情进度。彼得想要把潜伏的关照的列表和这些关照的完成办法分别开来,因而他决意把办法分别为一个接口:
interfaceIWorkerEvents{
voidWorkStarted();
voidWorkProgressing();
intWorkCompleted();
}
classWorker{
publicvoidAdvise(IWorkerEventsevents){_events=events;}
publicvoidDoWork(){
Console.WriteLine(“事情:事情入手下手”);
if(_events!=null)_events.WorkStarted();
Console.WriteLine(“事情:事情举行中”);
if(_events!=null)_events.WorkProgressing();
Console.WriteLine("“事情:事情完成”");
if(_events!=null){
intgrade=_events.WorkCompleted();
Console.WriteLine(“工人的事情得分=”+grade);
}
}
privateIWorkerEvents_events;
}
classBoss:IWorkerEvents{
publicvoidWorkStarted(){/*老板不体贴。*/}
publicvoidWorkProgressing(){/*老板不体贴。*/}
publicintWorkCompleted(){
Console.WriteLine(“工夫差未几!”);
return3;/*总分为10*/
}
}
  托付
  不幸的是,每当彼得忙于经由过程接口的完成和老板交换时,就没无机会实时关照宇宙了。最少他应当疏忽身在远方的老板的援用,好让其他完成了IWorkerEvents的工具失掉他的事情呈报。(”AtleasthedabstractedthereferenceofhisbossfarawayfromhimsothatotherswhoimplementedtheIWorkerEventsinterfacecouldbenotifiedofhisworkprogress”原话云云,不睬解究竟是甚么意义)
  他的老板仍是埋怨得很凶猛。“彼得!”他老板吼道,“你为何在事情一入手下手和事情举行中都来烦我?!我不体贴这些事务。你不仅强制我完成了这些办法,并且还在华侈我可贵的事情工夫来处置你的事务,出格是当我外出的时分更是云云!你能不克不及不再来烦我?”
  因而,彼满意识到接口固然在良多情形都很有效,可是当用作事务时,“粒度”不敷好。他但愿可以仅在他人想要时才关照他们,因而他决意把接口的办法分别为独自的托付,每一个托付都像一个小的接口办法:
delegatevoidWorkStarted();
delegatevoidWorkProgressing();
delegateintWorkCompleted();
classWorker{
publicvoidDoWork(){
Console.WriteLine(“事情:事情入手下手”);
if(started!=null)started();
Console.WriteLine(“事情:事情举行中”);
if(progressing!=null)progressing();
Console.WriteLine("“事情:事情完成”");
if(completed!=null){
intgrade=completed();
Console.WriteLine(“工人的事情得分=”+grade);
}
}
publicWorkStartedstarted;
publicWorkProgressingprogressing;
publicWorkCompletedcompleted;
}
classBoss{
publicintWorkCompleted(){
Console.WriteLine("Better...");
return4;/*总分为10*/
}
}
classUniverse{
staticvoidMain(){
Workerpeter=newWorker();
Bossboss=newBoss();
peter.completed=newWorkCompleted(boss.WorkCompleted);
peter.DoWork();
Console.WriteLine(“Main:工野生作完成”);
Console.ReadLine();
}
}
  静态监听者
  如许,彼得不会再拿他老板不想要的事务来烦他老板了,可是他还没有把宇宙放到他的监听者列表中。由于宇宙是个包容统统的实体,看来不合适利用实例办法的托付(想像一下,实例化一个“宇宙”要消费几资本…..),因而彼得就必要可以对静态托付举行挂钩,托付对这一点撑持得很好:
classUniverse{
staticvoidWorkerStartedWork(){
Console.WriteLine("Universenoticesworkerstartingwork");
}
staticintWorkerCompletedWork(){
Console.WriteLine("Universepleasedwithworkerswork");
return7;
}
staticvoidMain(){
Workerpeter=newWorker();
Bossboss=newBoss();
peter.completed=newWorkCompleted(boss.WorkCompleted);
peter.started=newWorkStarted(Universe.WorkerStartedWork);
peter.completed=newWorkCompleted(Universe.WorkerCompletedWork);
peter.DoWork();
Console.WriteLine(“Main:工野生作完成”);
Console.ReadLine();
}
}
  事务
  不幸的是,宇宙太忙了,也不习气时候存眷它内里的个别,它能够用本人的托付交换了彼得老板的托付。这是把彼得的Worker类的的托付字段做成public的一个有意识的反作用。一样,假如彼得的老板不耐心了,也能够决意本人来引发彼得的托付(真是一个卤莽的老板):
//Petersbosstakingmattersintohisownhands
if(peter.completed!=null)peter.completed();
  彼得不想让这些事产生,他意想到必要给每一个托付供应“注册”和“反注册”功效,如许监听者就能够本人增加和移除托付,但同时又不克不及清空全部列表也不克不及随便引发彼得的事务了。彼得并没有来本人完成这些功效,相反,他利用了event关头字让C#编译器为他构建这些办法:
classWorker{
...
publiceventWorkStartedstarted;
publiceventWorkProgressingprogressing;
publiceventWorkCompletedcompleted;
}
  彼得晓得event关头字在托付的外边包装了一个property,仅让C#客户经由过程+=和-=操纵符来增加和移除,强制他的老板和宇宙准确地利用事务。
staticvoidMain(){
Workerpeter=newWorker();
Bossboss=newBoss();
peter.completed+=newWorkCompleted(boss.WorkCompleted);
peter.started+=newWorkStarted(Universe.WorkerStartedWork);
peter.completed+=newWorkCompleted(Universe.WorkerCompletedWork);
peter.DoWork();
Console.WriteLine(“Main:工野生作完成”);
Console.ReadLine();
}
  “劳绩”一切了局
  到这时候,彼得终究能够送一口吻了,他乐成地满意了一切监听者的需求,同时制止了与特定完成的紧耦合。可是他注重到他的老板和宇宙都为它的事情打了分,可是他仅仅吸收了一个分数。面临多个监听者,他想要“劳绩”一切的了局,因而他深切到代办署理内里,轮询监听者列表,手工一个个挪用:
publicvoidDoWork(){
...
Console.WriteLine("“事情:事情完成”");
if(completed!=null){
foreach(WorkCompletedwcincompleted.GetInvocationList()){
intgrade=wc();
Console.WriteLine(“工人的事情得分=”+grade);
}
}
}
  异步关照:引发&忘记
  同时,他的老板和宇宙还要忙于处置其他事变,也就是说他们给彼得打分所消费的事务变得十分长:
classBoss{
publicintWorkCompleted(){
System.Threading.Thread.Sleep(3000);
Console.WriteLine("Better...");return6;/*总分为10*/
}
}
classUniverse{
staticintWorkerCompletedWork(){
System.Threading.Thread.Sleep(4000);
Console.WriteLine("Universeispleasedwithworkerswork");
return7;
}
...
}
  很不幸,彼得每次关照一个监听者后必需守候它给本人打分,如今这些关照消费了他太多的事情事务。因而他决意忘记分数,仅仅异步引发事务:
publicvoidDoWork(){
...
Console.WriteLine("“事情:事情完成”");
if(completed!=null){
foreach(WorkCompletedwcincompleted.GetInvocationList())
{
wc.BeginInvoke(null,null);
}
}
}
  异步关照:轮询
  这使得彼得能够关照他的监听者,然后当即前往事情,让历程的线程池来挪用这些代办署理。跟着工夫的已往,彼得发明他丧失了他事情的反应,他晓得听取他人的歌颂和勉力事情一样主要,因而他异步引发事务,可是周期性地轮询,获得可用的分数。
publicvoidDoWork(){
...
Console.WriteLine("“事情:事情完成”");
if(completed!=null){
foreach(WorkCompletedwcincompleted.GetInvocationList()){
IAsyncResultres=wc.BeginInvoke(null,null);
while(!res.IsCompleted)System.Threading.Thread.Sleep(1);
intgrade=wc.EndInvoke(res);
Console.WriteLine(“工人的事情得分=”+grade);
}
}
}
  异步关照:托付
  不幸地,彼得有回到了一入手下手就想制止的情形中来,好比,老板站在面前盯着他事情。因而,他决意利用本人的托付作为他挪用的异步托付完成的关照,让他本人当即回到事情,可是仍能够在他人给他的事情打分后失掉关照:
publicvoidDoWork(){
...
Console.WriteLine("“事情:事情完成”");
if(completed!=null){
foreach(WorkCompletedwcincompleted.GetInvocationList()){
wc.BeginInvoke(newAsyncCallback(WorkGraded),wc);
}
}
}
privatevoidWorkGraded(IAsyncResultres){
WorkCompletedwc=(WorkCompleted)res.AsyncState;
intgrade=wc.EndInvoke(res);
Console.WriteLine(“工人的事情得分=”+grade);
}
  宇宙中的幸运
  彼得、他的老板和宇宙终极都满意了。彼得的老板和宇宙能够收到他们感乐趣的事务关照,削减了完成的包袱和非必须的往复“差盘缠”。彼得能够关照他们,而不论他们要花多长工夫来从目标办法中前往,同时又能够异步地失掉他的了局。彼得晓得,这其实不*非常*复杂,由于当他异步引发事务时,办法要在别的一个线程中实行,彼得的目标办法完成的关照也是一样的事理。可是,迈克和彼得是好伴侣,他很熟习线程的事变,能够在这个范畴供应引导。
  他们永久幸运地生存下往……<完>
计算机发展到这个时候,很多技术日益成熟,想学好一种技术都是不容易的,当你学会用的时候你对它的很多原理可能很不了解)
因胸联盟 该用户已被删除
沙发
发表于 2015-1-19 17:13:00 | 只看该作者
ASP是把代码交给VBScript解释器或Jscript解释器来解释,当然速度没有编译过的程序快了。
乐观 该用户已被删除
板凳
发表于 2015-1-25 17:12:46 | 只看该作者
ASP在执行的时候,是由IIS调用程序引擎,解释执行嵌在HTML中的ASP代码,最终将结果和原来的HTML一同送往客户端。
爱飞 该用户已被删除
地板
发表于 2015-2-3 12:00:07 | 只看该作者
代码的可重用性差:由于是面向结构的编程方式,并且混合html,所以可能页面原型修改一点,整个程序都需要修改,更别提代码重用了。
金色的骷髅 该用户已被删除
5#
发表于 2015-2-8 20:44:39 | 只看该作者
ASP.net的速度是ASP不能比拟的。ASP.net是编译语言,所以,当第一次加载的时候,它会把所有的程序进行编译(其中包括worker进程,还有对语法进行编译,形成一个程序集),当程序编译后,执行速度几乎为0。
老尸 该用户已被删除
6#
发表于 2015-2-26 09:20:31 | 只看该作者
CGI程序在运行的时候,首先是客户向服务器上的CGI程序发送一个请求,服务器接收到客户的请求后,就会打开一个新的Process(进程)来执行CGI程序,处理客户的请求。CGI程序最后将执行的结果(HTML页面代码)传回给客户。
再现理想 该用户已被删除
7#
发表于 2015-3-8 13:15:17 | 只看该作者
主流网站开发语言之CGI:CGI就是公共网关接口(CommonGatewayInterface)的缩写。它是最早被用来建立动态网站的后台技术。这种技术可以使用各种语言来编写后台程序,例如C,C++,Java,Pascal等。
简单生活 该用户已被删除
8#
发表于 2015-3-16 01:16:54 | 只看该作者
能产生和执行动态、交互式、高效率的站占服务器的应用程序。运用ASP可将VBscript、javascript等脚本语言嵌入到HTML中,便可快速完成网站的应用程序,无需编译,可在服务器端直接执行。容易编写。
愤怒的大鸟 该用户已被删除
9#
发表于 2015-3-22 18:18:39 | 只看该作者
Asp.net脚本的出现,为ASP空间带来了更高的稳定性,同时也为程序员建站提供更高环境!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-1-10 06:07

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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