Asp.net中的异步页面
要想了解asp.net 2.0的异步页的处理过程,先列出页面的生命周期:
1 :init 事件: 页面初始化 ,初始化设置。
2: loadviewstate方法: 加载视图状态, 填充viewstate属性。
3 :loadpostdata方法: 处理回发数据, 处理传入窗体数据。
4: load 事件: 加载页面 ,页面控件初始化完成并反映了客户端的数据。
5 :raisepostdatachangedevent方法: 回发更改通知 引发更改事件。
6 :raisepostbackevent方法: 处理回发事件 ,处理引起回发的客户端事件,并在服务上引发相应时间。
7: prerender事件: 页面预呈现 。
8 :saveviewstate方法: 保存视图状态, 将viewstate属性保存到字符串中。
9 :render方法: 呈现页面 。
10: dispose方法: 处置是否对昂贵资源的引用。
11 :unload事件: 卸载页面 。
页面处理方式:
1:同步处理;
2:异步处理。
同步请求过程:
1:asp.net 收到页面请求时,从线程池中提取一个线程并将请求分配给该线程。
2:页在该请求期间保留线程,防止该线程用于处理其他请求。
3:如果一个同步请求需要运算时间较长,此时分配给该请求的线程在调用返回之前处于挂起状态。
4:等待线程返回后完成页面的其它生命周期。
同步请求的生命周期和线程关系图:
同步请求的问题:
线程池的可用线程是有限的,如果此时请求过多,asp.net 因 503“server unavailable”错误使后续请求失败。这让asp.net能够接收的请求量会大大减少,影响了可伸缩性。
异步的处理过程:
前面的两点和普通同步请求一样,不同的是对于比较费时的过程的处理方式:
1:一个异步操作开始响应 asp.net 的信号之后,该线程返回线程池。
2:asp.net 调用使用 addonprerendercompleteasync 注册的 begin 方法。begin 方法的任务是启动诸如数据库查询或 web 服务调用的异步操作,并立即返回。
3:线程返回到线程池。同时,begin 方法返回 iasyncresult。
4: asp.net 从线程池提取线程并调用 end 方法。
5:当 end 返回之后,asp.net 执行该页生命周期其余的部分。
异步请求的生命周期和线程关系图:
异步的优势:
线程池线程得到了高效的使用,提高了可伸缩性。原来挂起等待的线程现在可用于服务其他请求。
异步加载数据的示例:
第一步:让页面支持异步。设置async属性。
第二步:因为是操作数据库,想让数据库支持异步,需要对数据库连接串进行配置。
asynchronous processing=true。
第三步:在页面的page_load事件中注册异步事件。
protected void page_load(object sender, eventargs e)
{
addonprerendercompleteasync(
new begineventhandler(beginasyncoperation),
new endeventhandler(endasyncoperation)
);
}
iasyncresult beginasyncoperation(object sender, eventargs e, asynccallback cb, object state)
{
string sql = "select top 10 * from dbo.card_ext";
sqlconnection _conn = new sqlconnection(configurationmanager.
appsettings["dataaccesscontionstringread"].tostring());
_conn.open();
sqlcommand cmd = new sqlcommand(sql, _conn);
iasyncresult risynresult = cmd.beginexecutereader(cb, cmd,
commandbehavior.closeconnection);
return risynresult;
}
void endasyncoperation(iasyncresult iresult)
{
if (!iresult.iscompleted)
{
iresult.asyncwaithandle.waitone();
}
else
{
sqldatareader dr = (iresult.asyncstate as sqlcommand).endexecutereader(iresult);
if (!dr.isclosed)
{
list<string> _list = new list<string>();
while (dr.read())
{
_list.add(dr[0].tostring());
}
this.gridview1.datasource = _list;
this.gridview1.databind();
}
dr.close();
}
}
1 :init 事件: 页面初始化 ,初始化设置。
2: loadviewstate方法: 加载视图状态, 填充viewstate属性。
3 :loadpostdata方法: 处理回发数据, 处理传入窗体数据。
4: load 事件: 加载页面 ,页面控件初始化完成并反映了客户端的数据。
5 :raisepostdatachangedevent方法: 回发更改通知 引发更改事件。
6 :raisepostbackevent方法: 处理回发事件 ,处理引起回发的客户端事件,并在服务上引发相应时间。
7: prerender事件: 页面预呈现 。
8 :saveviewstate方法: 保存视图状态, 将viewstate属性保存到字符串中。
9 :render方法: 呈现页面 。
10: dispose方法: 处置是否对昂贵资源的引用。
11 :unload事件: 卸载页面 。
页面处理方式:
1:同步处理;
2:异步处理。
同步请求过程:
1:asp.net 收到页面请求时,从线程池中提取一个线程并将请求分配给该线程。
2:页在该请求期间保留线程,防止该线程用于处理其他请求。
3:如果一个同步请求需要运算时间较长,此时分配给该请求的线程在调用返回之前处于挂起状态。
4:等待线程返回后完成页面的其它生命周期。
同步请求的生命周期和线程关系图:
同步请求的问题:
线程池的可用线程是有限的,如果此时请求过多,asp.net 因 503“server unavailable”错误使后续请求失败。这让asp.net能够接收的请求量会大大减少,影响了可伸缩性。
异步的处理过程:
前面的两点和普通同步请求一样,不同的是对于比较费时的过程的处理方式:
1:一个异步操作开始响应 asp.net 的信号之后,该线程返回线程池。
2:asp.net 调用使用 addonprerendercompleteasync 注册的 begin 方法。begin 方法的任务是启动诸如数据库查询或 web 服务调用的异步操作,并立即返回。
3:线程返回到线程池。同时,begin 方法返回 iasyncresult。
4: asp.net 从线程池提取线程并调用 end 方法。
5:当 end 返回之后,asp.net 执行该页生命周期其余的部分。
异步请求的生命周期和线程关系图:
异步的优势:
线程池线程得到了高效的使用,提高了可伸缩性。原来挂起等待的线程现在可用于服务其他请求。
异步加载数据的示例:
第一步:让页面支持异步。设置async属性。
第二步:因为是操作数据库,想让数据库支持异步,需要对数据库连接串进行配置。
asynchronous processing=true。
第三步:在页面的page_load事件中注册异步事件。
protected void page_load(object sender, eventargs e)
{
addonprerendercompleteasync(
new begineventhandler(beginasyncoperation),
new endeventhandler(endasyncoperation)
);
}
iasyncresult beginasyncoperation(object sender, eventargs e, asynccallback cb, object state)
{
string sql = "select top 10 * from dbo.card_ext";
sqlconnection _conn = new sqlconnection(configurationmanager.
appsettings["dataaccesscontionstringread"].tostring());
_conn.open();
sqlcommand cmd = new sqlcommand(sql, _conn);
iasyncresult risynresult = cmd.beginexecutereader(cb, cmd,
commandbehavior.closeconnection);
return risynresult;
}
void endasyncoperation(iasyncresult iresult)
{
if (!iresult.iscompleted)
{
iresult.asyncwaithandle.waitone();
}
else
{
sqldatareader dr = (iresult.asyncstate as sqlcommand).endexecutereader(iresult);
if (!dr.isclosed)
{
list<string> _list = new list<string>();
while (dr.read())
{
_list.add(dr[0].tostring());
}
this.gridview1.datasource = _list;
this.gridview1.databind();
}
dr.close();
}
}
顶一下
(0)
0%
踩一下
(0)
0%
- 最新评论 查看所有评论
-
- 发表评论 查看所有评论
-
- GRIDVIEW排序 动态实现和静态实现
- ASP.NET2.0数据操作之创建数据访问层
- 单点登录的实现
- ASP.NET程序中常用代码汇总
- ASP.NET中实时图表的实现
- ASP.NET中利用Crystal Report创建图表
- ASP.NET 2.0中Gridview控件高级技巧
- VB中String的用法及原理
- 网友整理 .net 面试题(附答案)
- ASP.NET 2.0轻松实现数据库应用开发
- ASP.NET AJAX入门系列(1):概述
- Visual Studio 2005中编译调试
- HijackThis使用详解
- ASP.NET AJAX入门系列(2):使用ScriptManager控
- ASP.NET MVC教程:理解模型、视图和控制器
- ASP.NET报表问题的解决方法
- 总结的asp.net mvc的执行流程
- 使用JS控制页面控件隐藏和显示的两种方法
- 关于ASP.NET页面打印技术的总结
- ASP.NET页面如何建立静态缓存
- 浅析ASP.NET MVC路由规则XML化的方法
- 详解ASP.NET MVC中属性标记的通用扩展方法
- 详解ASP.NET缓存的工作原理
- 如何将ViewState持久化
- C#实现前台与后台方法互调
- ASP.NET登陆控件membership的配置方法
- 体会ASP.NET异步处理请求的效果
- 正确使用异步操作
- 为ASP.NET MVC扩展异步Action功能(下)
- 使用ASP.NET MVC Futures 中的异步Action

