ASP.NET 2.0中的异步页面
ASP.NET页面运行原理
– IIS ISAPI Extension
– ASP.NET工作进程
– IIS应用程序池(进程池)
– 隔离级别
–
ASP.NET 页面运行原理
– 实现IHttpAsyncHandler接口
– 自定义的线程池
– 缺点:
" 实现复杂
" 没有系统机制的支持
ASP.NET 2.0中的异步页面
– 设置
<%@ Page Async="true" ... %>
– 代码
AddOnPreRenderCompleteAsync (
new BeginEventHandler(MyBeginMethod),
new EndEventHandler (MyEndMethod)
);
异步调用Web服务
proxy.FooCompleted += new FooCompletedEventHandler
proxy.FooAsync (...);
...
void OnFooCompleted (Object source,FooCompletedEventArgs e)
{
// Called when Foo completes
}
【实例代码】
首先如果要在页面进行异步调用,一定要把页面的Async属性设置为true:
<%@ Page Language="C#" Async="true" AutoEventWireup="true"
首先我们看看页面中简单的异步调用实现获取目标网页的代码:
using System.Text.RegularExpressions; //正则表达式的引用空间
System.Net.WebRequest myRequest;
protected void Page_Load(object sender, EventArgs e)
{
Label1.Text = "Page_Load: thread #" + System.Threading.Thread.CurrentThread.GetHashCode();
}
protected IAsyncResult BeginGetAsyncData(Object src, EventArgs args, AsyncCallback cb, Object state)
{
}
protected void EndGetAsyncData(IAsyncResult ar)
{
}
下面我们再看看通过注册到页的异步任务来实现同样的功能:
protected void Page_Load(object sender, EventArgs e)
{
}
protected IAsyncResult BeginGetAsyncData(Object src, EventArgs args, AsyncCallback cb, Object state)
{
}
protected void EndGetAsyncData(IAsyncResult ar)
{
}
protected void TimeOutHandler(IAsyncResult ar)
{
}
再看看一个服务器端与数据库进行异步回调的例子:
private SqlCommand cmd;
private SqlDataReader sdr;
protected void Page_Load(object sender, EventArgs e)
{
}
protected IAsyncResult BeginGetAsyncData(Object src, EventArgs args, AsyncCallback cb, Object state)
{
}
protected void EndGetAsyncData(IAsyncResult ar)
{
}
protected void Page_PreRenderComplete(object sender, EventArgs e)
{
}
最后看看与WEB服务进行异步回调的例子
[MSDN注解]
1.
ASP.NET 版本 2.0 允许您注册多个任务到页,并在呈现页之前异步运行这些任务。如果任务进程缓慢,且您不希望在执行它时拖延其他进程,则您可指定异步运行该任务。异步任务可并行或顺序执行。
PageAsyncTask 对象必须通过 RegisterAsyncTask 方法注册到页。页本身无需异步处理以执行异步任务。您可在页指令上将 Async 属性设置为 true(如下面的代码示例所示)或 false,异步任务将仍然异步处理:
<%@ Page Async="true" %>
当 Async 属性设置为 false 时,在所有异步任务完成之前,执行页的线程将被阻止。
任何在 PreRenderComplete 事件之前注册的异步任务如果还未执行,则将由页自动执行。在 PreRenderComplete 事件之后注册的异步任务必须通过 ExecuteRegisteredAsyncTa
默认情况下,如果异步任务未在 45 秒钟内完成,则它将超时。您可在 Web.config 文件或页指令中指定不同的超时值。Web.config 文件的 <pages> 节包含 asyncTimeout 属性,如下所示。
<system.web>
<pages asyncTimeout="30"> </pages>
</system.web>
页指令包含 AsyncTimeout 属性。
<%@ Page AsyncTimeout="30" %>
2.
使用 AddOnPreRenderCompleteAs
可以注册多个异步处理程序;但一次只能运行一个处理程序。如果要同时处理多个异步方法,应使用单个 BeginEventHandler 方法,并从该处理程序启动多个异步操作。
异步处理程序是在 PreRender 和 PreRenderComplete 事件之间调用的。
首先,运行所有 Page 事件(通过 PreRender 事件),然后调用每个已注册的 BeginEventHandler 方法。当处理程序完成时,调用相应的 EndEventHandler 方法。如果存在多个异步处理程序,则调用下一个处理程序。
在调用了已注册的异步事件处理程序后,从 PreRenderComplete 事件开始调用其余的页事件。