柔情似水 发表于 2015-1-16 22:17:32

ASP.NET网页编程之.Net组件程序计划之异步伐用

c语言的编译器,几乎是所有新平台都有的。因此从这点上看,c语言的程序,比其他任何语言更加容易跨平台。说到异步伐用,在脑海中起首想到就是BeginInvoke(),在一些经常使用工具中我们也会经常见到Invoke()和BeginInvoke(),要想让本人的组件能够被客户端挪用大概是异步伐用,如许的计划是公道的,这也是组件异步机制傍边的一条(说句题外话--实在年夜多半常识都埋没在我们平常常常见到的工具大概是代码里,只不外是没有往仔细的发明)在.NET中起首就会想到利用托付来举行异步伐用,关于托付的界说在托付与事务一文中已也许的说过了,文中只是对托付举行了也许的解说,并没有对托付的利用来讲明大概是例举一些示例。在本篇中将会对托付举行一个基本的揭底,次要偏向是异步伐用。
一托付的老调重弹
publicclassOperation{publicintAddition(intnum1,intnum2){returnnum1+num2;}publicintSubtraction(intnum1,intnum2){returnnum1-num2;}}没有需要间接利用Operation工具来举行加减运算,可使用托付:
publicdelegateintOperationDelegate(intnum1,intnum2);Operationoperation=newOperation();OperationDelegateAdditiondelegate=operation.Addition;intresult;result=Additiondelegate.Invoke(3,4);Debug.Assert(result==7);在利用托付举行挪用的时分,以后线程是被堵塞的,只要当托付实行终了了,才会把把持权交回到以后线程。
不外呢,托付能够用于举行异步伐用方针办法的,托付只是一种特定的范例,编译器会把我们界说的形形色色的托付编译成
对应的类,比如OperationDelegate托付一样,实则是被编译成如许的
publicsealedclassOperationDelegate:MulticastDelegate{publicOperationDelegate(Objecttarget,intmethodPtr){}publicvirtualInvoke(intnum1,intnum2){……}publicvirtualIAsyncResultBeginInvoke(intnum1,intnum2,AsyncCallbackcallback,objectasyncState){……}publicvirtualintEndInvoke(IAsyncResultresult){……}}这里只是回忆一下托付的界说。
二异步伐用编程模子


在上图我们所见的有这几个模块,.NET线程池、异步伐用哀求行列和一个使用程序的主线程。
倘使如今从义务1入手下手实行就任务2、义务3,到了义务3的时分,义务3哀求.NET实行异步操纵,如


这个时分【义务3】已被送进到了【异步哀求行列】中,而且主线程是堵塞形态的,再看的实行历程:


线程池会实时的发明【异步哀求行列】中的义务,而且依据义务的信息,线程池会分派一个线程就任务地点的主线程中实行所哀求的义务。在异步义务实行时,这个时分主线程才会从堵塞中打消,进进实行形态,上图中,就是入手下手实行义务4。
这里要说的就是,异步伐用看起来是并行实行的,实践刚入手下手的时分仍是按次的,不外这时候间在实践情形中是疏忽不计的,能够以为就是并行实行的吧。
三BeginInvoke()、EndInvoke()
3.1BeginInvoke()
BeginInvoke()函数界说以下:
1publicvirtualIAsyncResultBeginInvoke(intnum1,intnum2,AsyncCallbackcallback,objectasyncState)2{3……4}承受OperationDelegate托付界说的原始署名的输出参数,另有两个分外参数,AsyncCallback是体系界说的托付,用于异步伐用完成时回调所用,这里不做解说,前面会有讲到,另有一个是参数是一个形态工具,也能够以为是容器工具,也会在前面的章节中讲到。
1Operationoperation=newOperation();2OperationDelegateAdditiondelegate=operation.Addition;3Additiondelegate.BeginInvoke(3,4,null,null);3.2IAsyncResult接口
正如下面所看到的,BeginInvoke函数前往一个IAsyncResult范例的值,那就来看一下IAsyncResult的界说:
publicinterfaceIAsyncResult{objectAsyncState{get;}WaitHandleAsyncWaitHandle{get;}boolCompletedSynchronously{get;}boolIsCompleted{get;}}关于IAsyncResult的具体用法稍后会有解说

看到第一节的Invoke函数实行后,能够间接猎取到前往值,怎样这个BeginInvoke函数实行了前往

IAsyncResult范例,前往值在哪呢?能够经由过程从BeginInvoke函数取得的IAsyncResult交给EndInvoke函数来猎取前往值。

1Operationoperation=newOperation();
2OperationDelegateAdditiondelegate=operation.Addition;
3
4IAsyncResultasyncResult=Additiondelegate.BeginInvoke(3,4,null,null);
5intresult=Additiondelegate.EndInvoke(asyncResult);
6Debug.Assert(result==7);

这里要说几点

第一.挪用EndInvoke函数的时分,以后线程是被堵塞的,它在守候BeginInvoke函数实行终了。

第二.固然托付能够办理多个方针办法,可是在异步伐用中,所实行异步伐用的托付,外部的办理列表只能有一个方针办法,否则会报有非常。

第三.EndInvoke()在每次异步伐用操纵时只能挪用一次。

第四.BeginInvoke()前往的IAsyncResult范例的实例,只能传进它所挪用BeginInvoke()托付的EndInvoke()中,否则也会报有非常。
3.3AsyncResult
倘使一个客户端在一个代码段大概是函数中利用BeginInvoke(),而在另外一段大概是其他的函数中挪用EndInvoke(),如许客户端是不是就要保留IAsyncResult工具,又大概一个客户端倡议异步伐用,而且由另外一个客户端来挪用EndInvoke(),这不单单要保留IAsyncResult工具,还必要保留该托付工具,并且你还得传送已往。还好.NET是那末的机灵,有System.Runtime.Remoting.Messaging.AsyncResult范例的存在。
publicclassAsyncResult:IAsyncResult,IMessageSink
{

#regionIAsyncResult成员

publicobjectAsyncState
{
get{thrownewNotImplementedException();}
}

publicSystem.Threading.WaitHandleAsyncWaitHandle
{
get{thrownewNotImplementedException();}
}

publicboolCompletedSynchronously
{
get{thrownewNotImplementedException();}
}

publicboolIsCompleted
{
get{thrownewNotImplementedException();}
}

#endregion

publicboolEndInvokeCalled{get;set;}

publicvirtualobjectAsyncDelegate{get;}


//IMessageSink成员
}
看着下面有个AsyncDelegate的属性,会不会以为很大度,不错,它就是原始倡议托付的援用,看下怎样利用AsyncDelegate来利用EndInvoke():
publicclassOperationTest
{

publicvoidTest()
{
Operationoperation=newOperation();
OperationDelegateAdditiondelegate=operation.Addition;
intResult;
Result=GetResult(Additiondelegate.BeginInvoke(3,4,null,null));
}

privateintGetResult(IAsyncResultasyncresult)
{
AsyncResultasyncResult=(AsyncResult)asyncresult;
OperationDelegateoperationdelegate=asyncResult.AsyncDelegateas

OperationDelegate;
if(operationdelegate!=null)
{
Debug.Assert(asyncResult.EndInvokeCalled==false);//EndInvoke()是不是被挪用过
returnoperationdelegate.EndInvoke(asyncResult);
}
return-1;
}
}
3.4轮循或守候
看到这里,擅长思索的伴侣会发明,还存在着一个很年夜的成绩,就是倡议异步伐用的客户端,怎样晓得本人的异步函数是不是实行终了了?大概是想守候一会,做一些其他的处置,然后再持续守候,该怎样来完成呢?
从BeginInvoke()前往的IAsyncResult接口有个AsyncWaitHandle属性,它是干嘛的呢?就把它了解为动静吸收器吧。
Operationoperation=newOperation();
OperationDelegateAdditiondelegate=operation.Addition;
IAsyncResultasyncResult=Additiondelegate.BeginInvoke(2,3,null,null);
asyncResult.AsyncWaitHandle.WaitOne();//假如义务完成则不会堵塞不然堵塞以后线程
intResult;
Result=Additiondelegate.EndInvoke(asyncResult);
Debug.Assert(Result==5);
代码和3.2的几近不异,区分就是这段代码包管了EndInvoke()的挪用者不会被堵塞。
看一上等待一下,假如没完成处置其他义务,返来再守候是怎样完成的。
Operationoperation=newOperation();
OperationDelegateAdditiondelegate=operation.Addition;
IAsyncResultasyncResult=Additiondelegate.BeginInvoke(2,3,null,null);
while(asyncResult.IsCompleted==false)//判别异步义务是不是完成
{
asyncResult.AsyncWaitHandle.WaitOne(10,false);//假如义务完成则不会堵塞不然堵塞以后线程10毫秒
//这里做一些其他操纵
}
intResult;
Result=Additiondelegate.EndInvoke(asyncResult);
Debug.Assert(Result==5);
3.5利用回调函数
如今我们要来讲说BeginInvoke()的第三个参数了,publicdelegatevoidAsyncCallback(IAsyncResultar);
第三个参数就是体系供应的一个托付范例,托付署名也都看到了。利用回调函数的优点就是不必要去向理守候操纵了,由于在异步义务完成的时分,会挪用你传给BeginInvoke()里AsyncCallback托付所联系关系的方针办法。
publicclassOperationTest
{

publicvoidTest()
{
Operationoperation=newOperation();
OperationDelegateAdditiondelegate=operation.Addition;

Additiondelegate.BeginInvoke(2,3,newAsyncCallback(OnCallBack),null);
}

privatevoidOnCallBack(IAsyncResultasyncresult)
{
AsyncResultasyncResult=(AsyncResult)asyncresult;
OperationDelegateoperationdelegate=asyncResult.AsyncDelegateas

OperationDelegate;
if(operationdelegate!=null)
{
Debug.Assert(asyncResult.EndInvokeCalled==false);
intresult=operationdelegate.EndInvoke(asyncResult);
Console.WriteLine("Operationreturned"+result.ToString());
}
}
}
这里必要说的是在异步义务完成时,实行的回调函数仍然是在子线程傍边,并非在主线程中实行回调函数的。
题外话:最多见的就是在Winform开辟中,Form中倡议异步伐用,然后回调函数操纵Form中的控件大概是
值的时分就会报错,就是这个缘故原由,由于它们不在一个线程也不在一个高低文中,基于.NET平安战略这类操纵是不同意的。
如果英语好,口才好,加上女孩子的优势说不定有机会进去做做别的工具)

小妖女 发表于 2015-1-19 06:48:34

asp.net最主要特性包括:◆编程代码更简洁◆网站可实现的功能更强大◆运行效率高◆节省服务器的动作资源

老尸 发表于 2015-1-26 15:34:53

主流网站开发语言之CGI:CGI就是公共网关接口(CommonGatewayInterface)的缩写。它是最早被用来建立动态网站的后台技术。这种技术可以使用各种语言来编写后台程序,例如C,C++,Java,Pascal等。

再现理想 发表于 2015-2-4 20:05:45

能产生和执行动态、交互式、高效率的站占服务器的应用程序。运用ASP可将VBscript、javascript等脚本语言嵌入到HTML中,便可快速完成网站的应用程序,无需编译,可在服务器端直接执行。容易编写。

精灵巫婆 发表于 2015-2-10 06:19:32

比如封装性、继承性、多态性等等,这就解决了刚才谈到的ASP的那些弱点。封装性使得代码逻辑清晰,易于管理,并且应用到ASP.Net上就可以使业务逻辑和Html页面分离,这样无论页面原型如何改变。

admin 发表于 2015-3-10 10:40:10

如今主流的Web服务器软件主要由IIS或Apache组成。IIS支持ASP且只能运行在Windows平台下,Apache支持PHP,CGI,JSP且可运行于多种平台,虽然Apache是世界使用排名第一的Web服务器平台。

蒙在股里 发表于 2015-3-17 06:42:19

同时也感谢博客园给我们这个平台,也感谢博客园的编辑们做成专题引来这么多高人指点。

小女巫 发表于 2015-3-24 00:18:48

PHP的源代码完全公开,在OpenSource意识抬头的今天,它更是这方面的中流砥柱。不断地有新的函数库加入,以及不停地更新,使得PHP无论在UNIX或是Win32的平台上都可以有更多新的功能。它提供丰富的函数,使得在程式设计方面有着更好的资源。目前PHP的最新版本为4.1.1,它可以在Win32以及UNIX/Linux等几乎所有的平台上良好工作。PHP在4.0版后使用了全新的Zend引擎,其在最佳化之后的效率,比较传统CGI或者ASP等技术有了更好的表现。
页: [1]
查看完整版本: ASP.NET网页编程之.Net组件程序计划之异步伐用