在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
说到这就不得不谈.net的异步处理(Asynchronous),模型一般为BeginXXX,EndXXX,BeginXXX返回一个IAsycResult对象,其中包含对当前异步操作的信息,而EndXXX用户接受返回值,输出参数。.net从ThreadPool中分配一个空闲线程给BeginXXX然后立即返回给ThreadPool,等到异步处理结束时,.net又从ThreadPool中分配一个空闲线程用于处理EndXXX方法。这样就可能有足够的线程用于处理其它的事情。见于篇幅问题这里我们只谈asp.net 2.0的异步处理模型,我们都知道在1.x的时候要很好的建立页面的异步处理是比较麻烦的,可能微软很早就认识到了这一点,所以在2.0的版本中引入的新的页面处理模型,加入了方便的异步处理点(Asynchronous Point)在PreRender事件和PreRenderComplete事件之间,在这个异步点,页面需要等待所有的异步处理都完成,所以可以在页面呈现之前完成你需要的任何效果,极大简化了建立异步页面的方法。 首先你要在建立页面的@page声明中加入 Async="true",这是必须的。设置告诉asp.net要选用IHttpAsyncHandler来处理当前的页面。接下来你需要做的一般是在Page_Load事件处理中使用异步处理过程,现在有两种途径: 第一种就是使用Page.AddOnPreRenderCompleteAsync方法来处理需要异步处理的Begin和End方法集.如下: AddOnPreRenderCompleteAsync(new BeginEventHandler(MyBeginMethod),new EndEventHandler(myEndMethod)); void Page_Load (object sender, EventArgs e) IAsyncResult BeginAsyncOperation (object sender, EventArgs e, AsyncCallback cb, object state) void EndAsyncOperation (IAsyncResult ar) Regex regex = new Regex ("href\\s*=\\s*\"([^\"]*)\"", RegexOptions.IgnoreCase); StringBuilder builder = new StringBuilder(1024); Output.Text = builder.ToString (); 第二中就是注册异步任务(Register Asynchronous Task).RegisterAsyncTask比AddOnPreRenderCompleteAsync具有更大的灵活性和更多的优势。它可以允许你声明一个超时参数,同样可以声明在@Page中如:AsyncTimeout="5",以秒为单位,但要注意的是这里声明不是每个异步处理过程的超时而是整个页面的处理时间超时。同样.net framework 2.0还为注册任务引入了新的MethodAsync,MethodAsync就是为了方便处理多个异步过程的。例如: protected void Page_Load(object sender, EventArgs e) RegisterAsyncTask(task); IAsyncResult BeginAsyncOperation(object sender, EventArgs e, AsyncCallback cb, object state) void EndAsyncOperation(IAsyncResult ar) Regex regex = new Regex("href\\s*=\\s*\"([^\"]*)\"", RegexOptions.IgnoreCase); StringBuilder builder = new StringBuilder(1024); Output.Text = builder.ToString(); void TimeoutAsyncOperation(IAsyncResult ar) 总之合理的利用asp.net 2.0的异步处理,就可以极大的改善您大吞吐量高并发网站页面的性能。 |
请发表评论