|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
感觉很多控件都必须自己去写代码;用了WebMatrix感觉也不是很好,毕竟没有很强的WYSIWYG效果。现在就不知道如何是好了。asp.net|功能|页面 一样平常情形下我们一般在一个页面中,分离页面事务处置模子,按按次一步一步的声明各个处置历程。这就是所说的同步处置(Synchronous),我们能够很便利的界说页面处置的按次。同步处置固然很便利,但在耗时高哀求处置的时分就会表露严峻的成绩,在一个高并发的网站临盆服务器上,因为.net处置是基于所谓的ThreadPool的,而Threadpool中的处置线程又是无限的,假如以后ThreadPool中的线程已全体用尽,尔后继又有不休的年夜范围哀求的话,服务器的功能就会严峻的下落,更严峻的还会使服务器溃散。以是我们体贴最多的就是如何来更好的利用的.netThreadPool。让.net更好的发扬的功能。
说到这就不能不谈.net的异步处置(Asynchronous),模子通常是BeginXXX,EndXXX,BeginXXX前往一个IAsycResult工具,个中包括对以后异步操纵的信息,而EndXXX用户承受前往值,输入参数。.net从ThreadPool平分配一个余暇线程给BeginXXX然后当即前往给ThreadPool,比及异步处置停止时,.net又从ThreadPool平分配一个余暇线程用于处置EndXXX办法。如许便可能有充足的线程用于处置别的的事变。见于篇幅成绩这里我们只谈asp.net2.0的异步处置模子,我们都晓得在1.x的时分要很好的创建页面的异步处置是对照贫苦的,大概微软很早就熟悉到了这一点,以是在2.0的版本中引进的新的页面处置模子,到场了便利的异步处置点(AsynchronousPoint)在PreRender事务和PreRenderComplete事务之间,在这个异步点,页面必要守候一切的异步处置都完成,以是能够在页面出现之前完成你必要的任何效果,极年夜简化了创建异步页面的办法。
起首你要在创建页面的@page声明中到场Async="true",这是必需的。设置告知asp.net要选用IHttpAsyncHandler来处置以后的页面。接上去你必要做的通常为在Page_Load事务处置中利用异步处置历程,如今有两种路子:
第一种就是利用Page.AddOnPreRenderCompleteAsync办法来处置必要异步处置的Begin和End办法集.以下:
AddOnPreRenderCompleteAsync(newBeginEventHandler(MyBeginMethod),newEndEventHandler(myEndMethod));
经由过程增加下面的办法后,页面实行一般的性命周期事务直到页面的PreRender事务触发.然后Asp.net挪用先前在AddOnPreRenderCompleteAsync中的注册的Begin处置程序。一般在Begin处置程序中处置的是一些异步的web服务,IO和SQL的处置,如许就能够极年夜的减缓.net线程池的压力。比方:
<%@PageAsync="true"Language="C#"%>
<asp:ContentID="Content"ContentPlaceHolderID="Main"Runat="server">
<asp:LabelID="Output"Runat="server"></asp:Label>
</asp:Content>
publicpartialclassAsyncPage:System.Web.UI.Page
{
privateWebRequestm_Request;
voidPage_Load(objectsender,EventArgse)
{
AddOnPreRenderCompleteAsync(
newBeginEventHandler(BeginAsyncOperation),
newEndEventHandler(EndAsyncOperation)
);
}
IAsyncResultBeginAsyncOperation(objectsender,EventArgse,AsyncCallbackcb,objectstate)
{
m_Request=WebRequest.Create("http://www.dofor.cn");
returnm_Request.BeginGetResponse(cb,state);
}
voidEndAsyncOperation(IAsyncResultar)
{
stringtext;
using(WebResponseresponse=m_Request.EndGetResponse(ar))
{
using(StreamReaderreader=newStreamReader(response.GetResponseStream()))
{
text=reader.ReadToEnd();
}
}
Regexregex=newRegex("hrefs*=s*"([^"]*)"",RegexOptions.IgnoreCase);
MatchCollectionmatches=regex.Matches(text);
StringBuilderbuilder=newStringBuilder(1024);
foreach(Matchmatchinmatches)
{
builder.Append(match.Groups[1]);
builder.Append("<br/>");
}
Output.Text=builder.ToString();
}
}
第二中就是注册异步义务(RegisterAsynchronousTask).RegisterAsyncTask比AddOnPreRenderCompleteAsync具有更年夜的天真性和更多的上风。它能够同意你声明一个超时参数,一样能够声明在@Page中如:AsyncTimeout="5",以秒为单元,但要注重的是这里声明不是每一个异步处置历程的超时而是全部页面的处置工夫超时。一样.netframework2.0还为注册义务引进了新的MethodAsync,MethodAsync就是为了便利处置多个异步历程的。比方:
<%@PageAsync="true"Language="C#"%>
<asp:ContentID="Content"ContentPlaceHolderID="Main"Runat="server">
<asp:LabelID="Output"Runat="server"></asp:Label>
</asp:Content>
publicpartialclassAsyncPageTask:System.Web.UI.Page
{
privateWebRequestm_Request;
protectedvoidPage_Load(objectsender,EventArgse)
{
PageAsyncTasktask=newPageAsyncTask(
newBeginEventHandler(BeginAsyncOperation),
newEndEventHandler(EndAsyncOperation),
newEndEventHandler(TimeoutAsyncOperation),
null
);
RegisterAsyncTask(task);
}
IAsyncResultBeginAsyncOperation(objectsender,EventArgse,AsyncCallbackcb,objectstate)
{
m_Request=WebRequest.Create("http://www.dofor.cn");
returnm_Request.BeginGetResponse(cb,state);
}
voidEndAsyncOperation(IAsyncResultar)
{
stringtext;
using(WebResponseresponse=m_Request.EndGetResponse(ar))
{
using(StreamReaderreader=newStreamReader(response.GetResponseStream()))
{
text=reader.ReadToEnd();
}
}
Regexregex=newRegex("hrefs*=s*"([^"]*)"",RegexOptions.IgnoreCase);
MatchCollectionmatches=regex.Matches(text);
StringBuilderbuilder=newStringBuilder(1024);
foreach(Matchmatchinmatches)
{
builder.Append(match.Groups[1]);
builder.Append("<br/>");
}
Output.Text=builder.ToString();
}
voidTimeoutAsyncOperation(IAsyncResultar)
{
Output.Text="以后数据不成用";
}
}
总之公道的使用asp.net2.0的异步处置,就能够极年夜的改良您年夜吞吐量高并发网站页面的功能。另外,小型软件代码重用价值低,没有必要跨平台;大型软件,有严格的规划、部署,不可以随意跨平台。 |
|