ASP.NET 2.0的异步页面刷新真给劲

简介:

ASP.NET 2.0的异步页面刷新功能真得很酷,今天尝试用它解决我的一个应用问题,真是帮了大忙了。

我的页面要向后台的socket服务提交一个查询,首先这是一个可能长时间不返回的操作;其次为了拿到socket服务返回的长度不定、有可能很大的Response数据,我不得不采用了dotNET的IAsyncResult BeginReceive(byte[] buffer, int offset, int size,SocketFlags socketFlags, AsyncCallback callback, object state);办法来异步提交socket命令,然后在回调函数中迭代调用intEndReceive(IAsyncResult asyncResult);来获取Response数据直到数据被取完,这一系列的数据片断都缓存在一个MemoryBlock链表中。

这种情况下,ASP.NET页面要想用表格展示Response数据,必须能够被异步刷新。

ASP.NET 1.x 本质上不支持异步页,但是通过坚韧的努力和不懈地创新可以生成异步页。有关更多概述信息,请参阅MSDN®Magazine 2003 年 6 月刊的文章“Use Threads and Build Asynchronous Handlers in Your Server-Side Web Code”,该文章的作者是 Fritz Onion。

但ASP.NET 2.0 极大地简化了生成异步页的方式。首先使用该页的 @ Page 指令引入 Async=“true” 属性。

其次,在 Page_Load 时,注册事件Page_PreRender:

private void Page_Load(object sender, System.EventArgs e)

{

if (!IsPostBack)

{

// 注册事件Page_PreRender执行完成时执行方法

// Hook PreRenderComplete event for data binding

this.PreRenderComplete += new EventHandler(Page_PreRenderComplete);

接下来,我在点击按钮的事件函数中,开始我的异步操作之旅:

/// PageAsyncTask 的方式则是增强版本,除了异步页面处理开始和结束方法自身外,

/// 还可以提供在超时情况下的处理方法,以及处理时的状态对象。

///

PageAsyncTask task = new PageAsyncTask(

new BeginEventHandler(BeginSubmitKeywordsAsyncOperation),

new EndEventHandler(EndSubmitKeywordsAsyncOperation),

new EndEventHandler(TimeoutSubmitKeywordsAsyncOperation),

null

);

RegisterAsyncTask(task);

/// 对大多数简单的异步处理情况,可以直接调用AddOnPreRenderCompleteAsync 方法,

/// 提交页面请求开始和结束时的处理代码

//AddOnPreRenderCompleteAsync(

// new BeginEventHandler(BeginSubmitKeywordsAsyncOperation),

// new EndEventHandler(EndSubmitKeywordsAsyncOperation)

//);

该页经历其常规处理生命周期,直到 PreRender 事件刚刚引发之后。然后,ASP.NET 调用使用 RegisterAsyncTask注册的Begin 方法BeginSubmitKeywordsAsyncOperation。这个方法中我将向sokcet服务提交我的命令,然后将socket.BeginReceive方法得到的IasyncResult对象返回给ASP.NET。

然后,我的socket异步回调函数在最终全部获得数据流后,通过调用

callback.Invoke(result);

来通知页面socket这边已经完成工作了。

于是ASP.NET唤起EndSubmitKeywordsAsyncOperation方法:

/// <summary>

/// 异步调用结束后的接收方法(异步操作执行完成后,会重新从线程池中取个线程为本页面请求服务).

/// </summary>

/// <param name="ar"></param>

void EndSubmitKeywordsAsyncOperation(IAsyncResult ar)

{

_resultDataset = _submit.getResultDataset(ar);

在这个函数中,我就可以拿到数据流了。

之后,ASP.NET又唤起Page_PreRender事件,从而可以在这个事件中,把页面上的表格正确填充了。

这样,就达到了我的目的。而且向后台提交后等待被再度激活超时了,也可以由

void TimeoutSubmitKeywordsAsyncOperation(IAsyncResult ar)

来做合适的处理。

参考资源:

1:

ASP.NET 2.0 中的异步页

http://www.microsoft.com/china/msdn/library/webservices/asp.net/issuesWickedCodetoc.mspx?mfr=true

发布日期: 2006-4-19 | 更新日期: 2006-4-19

2:

ASP.NET 2.0 异步页面原理浅析 [1] Posted on 2005-12-27 00:28 Flier Lu

目录
相关文章
|
开发框架 移动开发 前端开发
ASP.NET MVC中使用jQuery Ajax通过FormData对象异步提交图片文件到服务端保存并返回保存的图片路径
ASP.NET MVC中使用jQuery Ajax通过FormData对象异步提交图片文件到服务端保存并返回保存的图片路径
251 0
|
开发框架 前端开发 JavaScript
[原创]Asp.net Mvc异步
[原创]Asp.net Mvc异步
[原创]Asp.net Mvc异步
|
前端开发 .NET Java
ASP.NET MVC EF 中使用异步控制器
最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来。 十年河东十年河西,莫欺少年穷 学无止境,精益求精   为什么使用异步操作/线程池  ASP.NET MVC 中为什么需要使用异步呢,IIS有一个线程池来处理用户的请求,当一个新的请求过来时,将调度池中的线程以处理该请求,然而,但并发量很高的情况下,池中的线程已经不能够满足这么多的请求时候,池中的每一个线程都处于忙的状态则在处理请求时将阻塞处理请求的线程,并且该线程不能对另一个请求提供服务,如果请求队列已满,则 Web 服务器会拒绝请求并处于 HTTP 503繁忙状态。
1295 0
|
.NET 数据库 开发框架
asp.net core异步进行新增操作并且需要判断某些字段是否重复的三种解决方案
之前碰到asp.net core异步进行新增操作并且需要判断某些字段是否重复的问题,进行插入操作的话会导致数据库中插入重复的字段!下面把我的解决方法记录一下,如果对您有所帮助,欢迎拍砖! 场景:EFCore操作MySql数据库的项目,进行高并发插入操作 需求:消息队列,最后进行新增数据的操作,插入前判断某些字段是否重复 问题:采用await db.SaveChangesAsync()进行提交操作前,FirstOrDefault判断数据库中是否有重复数据。
1683 0

相关实验场景

更多