ASP.NET 2.0的异步页面刷新真给劲
2008-06-08 06:01
330 查看
ASP.NET 2.0的异步页面刷新功能真得很酷,今天尝试用它解决我的一个应用问题,真是帮了大忙了。我的页面要向后台的socket服务提交一个查询,首先这是一个可能长时间不返回的操作;其次为了拿到socket服务返回的长度不定、有可能很大的Response数据,我不得不采用了dotNET的IAsyncResult BeginReceive(byte[] buffer, int offset, int size, SocketFlags socketFlags, AsyncCallback callback, object state);办法来异步提交socket命令,然后在回调函数中迭代调用int EndReceive(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方法: /// /// 异步调用结束后的接收方法(异步操作执行完成后,会重新从线程池中取个线程为本页面请求服务). /// /// 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-192:ASP.NET 2.0 异步页面原理浅析 [1] Posted on 2005-12-27 00:28 Flier Lu
相关文章推荐
- ASP.NET 2.0的异步页面刷新真给劲
- ASP.NET 2.0的异步页面刷新真给劲
- ASP.NET 2.0的异步页面刷新真给劲
- ASP.NET 2.0的异步页面刷新真给劲
- ASP.NET 2.0的异步页面刷新真给劲
- ASP.NET 2.0的异步页面刷新真给劲
- ASP.NET 2.0的异步页面刷新真给劲
- asp.net 2.0页面性能的考虑--异步页面处理模型
- ASP.NET 2.0中的异步页面(转)
- ASP.NET 2.0 正式版中无刷新页面的开发
- ASP.NET 2.0 正式版中无刷新页面的开发
- asp.net 2.0 无刷新页面初体验
- ASP.NET 2.0 正式版中无刷新页面的开发
- [修炼内功]ASP.NET 2.0客户端回调实现无刷新页面
- ASP.NET 2.0 中的异步页面
- ASP.NET 2.0,一个无刷新页面的小例子
- ASP.NET 2.0 异步页面原理浅析(1)
- ASP.Net Core 2.0 + Angular5 SPA程序刷新后找不到页面解决方法
- asp.net mvc Ajax.BeginForm不能异步刷新,或转到新页面,或页面还是刷新了,的原因(或解决办法)(转)
- asp.net 2.0页面性能的考虑--异步页面处理模型