网页中使用多线程来增强用户体验
日期:2007年12月12日 作者: 查看:[大字体 中字体 小字体]-
前几天遇到了一个问题,我在页面逻辑里需要调用一个webservice,处理一个比较耗时的操作,但是我不需要知道其返回值。于是我希望asp.net能像winform一样使用自动生成的webservice异步方法
你是不是想说:在页面调用webservice的时候,直接调用其异步实现不就完了吗?
这其实是行不通的,为了实现异步调用,我们需要对页面进行小小的改动,在Page元素里加上Async=true
我们很快就会发现这样做的问题:
让我们测试一下吧,现在我们在一个webservice的Helloworld方法中放入一个Thread。Sleep(10000),然后调用他的异步实现。通过调试,我们可以发现虽然程序运行至HelloworldAsync时,非常快速的返回并往下运行,但是当所有逻辑处理完成后,页面并不Response,而是硬生生等待我们的线程睡醒了才返回。
可是如果我希望真正做到调了不管怎么办呢?
Web中使用多线程来增强用户体验
你可以使用Thread,或者ThreadPool,自己来启动一个线程,我推荐使用ThreadPool,这样的话,这些线程都会被iis的线程池管理起来,不会造成崩溃
我们来分析一下这两种模式的运用有什么特点
WebService自带的异步模式为下图的模式
Web中使用多线程来增强用户体验
主线程调用子线程执行一个耗时操作(work1),同时执行一系列同步操作(w2...w5),然后交给w1返回
这种模式适合于work1有返回的情况,并且为了让work1得到充分的工作时间,异步调用的过程开始的越早越好,对web程序设计者而言,这里有一个很重要的问题:线程占用。。
刚才我们谈过,asp.net中每个请求都会有有一个线程来处理,而可以使用的线程是有限的,服务器会使用一个线程池来管理线程,当线程耗尽,ok,新来的请求只能蹲着排队,所以对web开发者而言,线程是个宝贵的资源,所以这个方案在并行处理的同时也增加了耗尽线程池的风险,毕竟一个请求造成了多个线程
用线程池来实现的模式属于下图
Web中使用多线程来增强用户体验
这种模式适合无返回的情况,这种情况下,对子线程的调用应该越晚越好,我们可以看到,主、子线程共存的时间越短,我们的稀缺资源线程就越安全,请注意的是,也许总的执行时间不会比同步的情况更少,但是我们很快就返回了用户界面,所以用户体验能够得到提高
使用web多线程的缺点 :
看了上面的叙述,你也许会说,那干脆把我所有的调用都改成异步调用吧,你尽管去做吧,绝对是一场灾难,因为在异步的同时,一定一会产生一个新的线程等待调用的返回,即使你调用函数的返回值为void,所以异步调用的负面效果将是会产生许多子线程,所以注意当你的调用非常耗时,这个子线程也将长期占用你的线程池,如果这样的调用大量出现,照样会消耗掉所有的可用线程
那么什么情况下适合在web上使用哪种多线程模式呢
我们来看看这段伪代码,他的用途是提交一个报告,方法传入一个报告,并从一个WebService中获得一些报告的内容,接着插入数据库,然后在文件服务器上生成一个报告文件,最后发出一个通知,让我们逐条命令的过一下这个方法,看看什么地方适合改为异步调用?(记得我们的讨论都是基于web的,关于桌面运用的多线程请参考 多线程总结一)
public void CreateReport(Report report){
//从webservice上取得报告的一些信息,不取得这些信息报告,报告是不完整的,是不能提交的
Report fullreport=CallWebService(report);
//插入数据库,很重要的工作
InsertIntoDataBase(fullreport)
try{
//生成报告文件,这里是一个耗时而且容易出错的操作
WriteStaticFile(fullreport)
}
catch{//记录错误日志。。。。}
//这个只是通知邮件
CallMailService2(fullreport)
}第一条语句CallWebService()从一个webservice里加载一些报告的内容,这个是业务逻辑相关的,因为如果不加载的话报告内容是不完整的,不能提交,显然不能改为异步调了不管的模式,在这里你可以尝试模式一,但是这个改动是没有作用的,因为其他所有的过程,包括插入数据库,生成报告都依赖于这个方法的返回,所以如果我们在这里使用异步的话,其他的所有操作都必须等待他的返回,所以采用异步除了多增加了线程以外,一点时间也不能节省
再来看插入数据库,和上面一样也没有必要使用异步调用
生成报告这里比较有趣,确实他是一个和逻辑息息相关的操作,但是通过分析代码,我们可以看出,虽然报告生成是一个重要业务步骤,但是并没有严格到说"如果不能生成报告,就必须回滚上面的操作",并且如果操作失败,在catch中也仅仅是记录了日志,并没有需要尝试重写的逻辑,(很有可能另外的某个程序或者某人,会定时查看日志,发现有错误就重新生成文件)也就是说,就这段代码而言,生成也可以算一个额外逻辑,那么自然也可以去异步操作.可是:千万注意!!
由于生成报告需要的时间较长,那么生成报告的子线程会长时间运行,长期无法返回线程池,如果请求量太大,频率太快,那就会耗尽线程资源了.
平心而论,这个问题其实不是异步造成的,即使时同步调用,执行此操作也需要化肥很长时间,调用量太大,频率太快,也会造成排队.而且由于返回时间太长,用户体验也不会好,所以我们的这个改造应该是有益的.
(出处:急速软件下载学院)
-
- 网页中使用多线程来增强用户体验 相关文章:
- ·Fireworks教程 液体金属表面特效制作
- ·Fireworks教程:立体质感水晶的制作过程
- ·Windows Vista中如何调整雅黑字体DPI
- ·Photoshop字体安装使用方法和技巧
- ·Lava-lava世界圣诞呼叫转移 体验梦幻圣诞
- ·Photoshop制作圣诞堆雪立体文字
- ·Photoshop将现成图案做成立体徽章
- ·QQ会员成长体系介绍及成长值换算参照表
- ·css属性之媒体(Media)类型
- ·有道阅读——网易在线RSS订阅服务新鲜体验
- 网页中使用多线程来增强用户体验 相关软件
- ·象棋巫师(繁体版)
- ·象棋巫师 简体版
- ·《实况足球2007》粤语存档繁体中文版
- ·《魔戒之中土大战2+资料片巫王的崛起》游侠全版本繁体中文汉化包
- ·凯撒大帝4-简体中文汉化包V0.8版
- ·凯撒大帝4-繁体中文汉化包V0.8版
- ·体育小游戏
- ·《伊苏之菲尔迦纳的誓约》繁体中文版+13修改器
- ·NDS《逆转裁判4 完美汉化简体中文版》模拟器
- ·《魔兽争霸》1.21简体中文补丁下载
- 特别声明:本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作
- 者.文章版权归文章原始作者所有.对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转
- 载的文章有版权问题请联系编辑人员,我们尽快予以更正. 转载请注明来源:http://www.hackhome.com
精品推荐
热点TOP10
- ·WebMatrix开发ASP.NET试用手记
- ·Textarea标签封装为Web在线编辑器
- ·如何清除网页的记录?
- ·网站地图制作工具
- ·iframe的用法总结
- ·IBM站一个网页到底包含了多少技术--看分析
- ·怎样制作网页?
- ·网页中的图片右击另存为无标题BMP的解决方法
- ·网页制作心得:揭开正则表达式的神秘面纱
- ·总结两年以来使用DIV网页排版的5点个人经验
- ·网页设计的色彩理论及应用
- ·从字体销售排名看英文字体设计使用
- ·前进中的Web3D
- ·c#如何获得cpu,硬盘的物理序列号
- ·应用色彩学
- ·站长常用广告代码的表达大全(不断更新中,希望收藏本页)
- ·.text urlRewrite介绍
- ·韩国优秀网站网址
- ·建站全攻略——从入门到精通(具体细节篇)
- ·建站全攻略——从入门到精通(总体规划篇)
特别推荐
- ·最大限度优化博客文章
- ·基本的页面设计元素布局比例
- ·网站策划书实例
- ·应用网页标准制作网站的几点好处
- ·网页设计心得:页面布局的简单规则
- ·注意:网页标题和网页Meta的写法
- ·网管员在日常维护局域网时的几点注意事项
- ·常用网页使用js技巧收集(200多个)
- ·WEB开发碰到的问题及经验十八则
- ·网页设计文字大小相关的四种设置方法
- ·怎样制作网页?
- ·谈论做网站的理念与技术
- ·“口碑营销”的关键问题是在效率
- ·网页制作,改变你的思维方式
- ·经营个人网站需要脚踏实地
- ·网页设计或制作中与键盘相关的一些技术
- ·Web设计 用户体验浅析
- ·国外译文:43个你应当避免的Web设计错误
- ·我们做网站的一些定律分享
- ·炼成高级网络编辑的三大原则
