linux社区爱心援助Linux认证系列教程业界动态站务新闻公司招聘网络学院网址大全LPI专题CISCO专题
设为首页
加入收藏
管理团队
JSP  
JAVA  
PERL  
 您的位置:首页 > 开发语言 > asp.net >
栏目导栏
  php
  JSP
  ASP
  asp.net
  JAVA
  c/c++/c#
  perl
  JavaScript
  Basic
  Delphi
资料搜索
热门文章
·NetBPM工作流的一个示例:请假
·Office Web Components(OWC)绘
·asp.net正则表达式语法
·asp.net 2.0 ajax中使用PopupC
·Ado.Net读取Excel常见问题总结
·数据源为空时如何让GridView显
·如何让UpdatePanel支持文件上传
·C#.Net的常见面试试题和参考答
·asp.net ajax客户端编程+jquer
·Brettle.Web.NeatUpload.dll支
·ASP.NET使用Cookie
·ASP.NET DEMO 15: 同时支持行单
·如何使IE的后退按钮无效
·如何在ASP.NET中用OWC绘制图表
·asp.net:正确判断当前用户角色
最新文章
·Ajax Control Toolkit Animati
·讨论一下类似BlogEngine内一次
·使用CSS+SiteMap+UserControl+
·Asp.net中多彩下拉框的实现
·浅谈ASP.NET的Postback
·分清ASP.NET AJAX中的Extender
·Tip:在使用AjaxControlTookit
·有关注册DataItem的一些可能被
·IIRF(Ionic's Isapi Rewrite
·asp.net 客户端回调功能的实现
·关于控件部分的看法--读Progra
·为什么在vista上做开发
·如何封装JS和CSS文件为服务器端
·岂今我看过的最强的排序算法
·设计模式学习笔记之单件模式
Google
 
Web中使用多线程来增强用户体验
[ 作者:  加入时间:2007-12-13 15:49:15  来自:Linux联盟收集整理 ]
前几天遇到了一个问题,我在页面逻辑里需要调用一个webservice,处理一个比较耗时的操作,但是我不需要知道其返回值。于是我希望asp.net能像winform一样使用自动生成的webservice异步方法 vvgLinux联盟
   vvgLinux联盟
  你是不是想说:在页面调用webservice的时候,直接调用其异步实现不就完了吗? vvgLinux联盟
   vvgLinux联盟
  这其实是行不通的,为了实现异步调用,我们需要对页面进行小小的改动,在Page元素里加上Async=true vvgLinux联盟
   vvgLinux联盟
  我们很快就会发现这样做的问题: vvgLinux联盟
   vvgLinux联盟
  让我们测试一下吧,现在我们在一个webservice的Helloworld方法中放入一个Thread。Sleep(10000),然后调用他的异步实现。通过调试,我们可以发现虽然程序运行至HelloworldAsync时,非常快速的返回并往下运行,但是当所有逻辑处理完成后,页面并不Response,而是硬生生等待我们的线程睡醒了才返回。 vvgLinux联盟
   vvgLinux联盟
  可是如果我希望真正做到调了不管怎么办呢? vvgLinux联盟
   vvgLinux联盟
  你可以使用Thread,或者ThreadPool,自己来启动一个线程,我推荐使用ThreadPool,这样的话,这些线程都会被iis的线程池管理起来,不会造成崩溃 vvgLinux联盟
   vvgLinux联盟
  我们来分析一下这两种模式的运用有什么特点 vvgLinux联盟
   vvgLinux联盟
  WebService自带的异步模式为下图的模式 vvgLinux联盟
   vvgLinux联盟
   vvgLinux联盟
  这种模式适合无返回的情况,这种情况下,对子线程的调用应该越晚越好,我们可以看到,主、子线程共存的时间越短,我们的稀缺资源线程就越安全,请注意的是,也许总的执行时间不会比同步的情况更少,但是我们很快就返回了用户界面,所以用户体验能够得到提高 vvgLinux联盟
   vvgLinux联盟
  使用web多线程的缺点 : vvgLinux联盟
   vvgLinux联盟
  看了上面的叙述,你也许会说,那干脆把我所有的调用都改成异步调用吧,你尽管去做吧,绝对是一场灾难,因为在异步的同时,一定一会产生一个新的线程等待调用的返回,即使你调用函数的返回值为void,所以异步调用的负面效果将是会产生许多子线程,所以注意当你的调用非常耗时,这个子线程也将长期占用你的线程池,如果这样的调用大量出现,照样会消耗掉所有的可用线程 vvgLinux联盟
   vvgLinux联盟
  那么什么情况下适合在web上使用哪种多线程模式呢 vvgLinux联盟
   vvgLinux联盟
  我们来看看这段伪代码,他的用途是提交一个报告,方法传入一个报告,并从一个WebService中获得一些报告的内容,接着插入数据库,然后在文件服务器上生成一个报告文件,最后发出一个通知,让我们逐条命令的过一下这个方法,看看什么地方适合改为异步调用?(记得我们的讨论都是基于web的,关于桌面运用的多线程请参考 多线程总结一) vvgLinux联盟
   vvgLinux联盟
  public void CreateReport(Report report){ vvgLinux联盟
   vvgLinux联盟
  //从webservice上取得报告的一些信息,不取得这些信息报告,报告是不完整的,是不能提交的 vvgLinux联盟
   vvgLinux联盟
  Report fullreport=CallWebService(report); vvgLinux联盟
   vvgLinux联盟
  //插入数据库,很重要的工作 vvgLinux联盟
   vvgLinux联盟
  InsertIntoDataBase(fullreport) vvgLinux联盟
   vvgLinux联盟
  try{ vvgLinux联盟
   vvgLinux联盟
  //生成报告文件,这里是一个耗时而且容易出错的操作 vvgLinux联盟
   vvgLinux联盟
  WriteStaticFile(fullreport) vvgLinux联盟
   vvgLinux联盟
  } vvgLinux联盟
   vvgLinux联盟
  catch{//记录错误日志。。。。} vvgLinux联盟
   vvgLinux联盟
  //这个只是通知邮件 vvgLinux联盟
   vvgLinux联盟
  CallMailService2(fullreport) vvgLinux联盟
   vvgLinux联盟
  } vvgLinux联盟
   vvgLinux联盟
  第一条语句CallWebService()从一个webservice里加载一些报告的内容,这个是业务逻辑相关的,因为如果不加载的话报告内容是不完整的,不能提交,显然不能改为异步调了不管的模式,在这里你可以尝试模式一,但是这个改动是没有作用的,因为其他所有的过程,包括插入数据库,生成报告都依赖于这个方法的返回,所以如果我们在这里使用异步的话,其他的所有操作都必须等待他的返回,所以采用异步除了多增加了线程以外,一点时间也不能节省 vvgLinux联盟
   vvgLinux联盟
  再来看插入数据库,和上面一样也没有必要使用异步调用 vvgLinux联盟
   vvgLinux联盟
  生成报告这里比较有趣,确实他是一个和逻辑息息相关的操作,但是通过分析代码,我们可以看出,虽然报告生成是一个重要业务步骤,但是并没有严格到说"如果不能生成报告,就必须回滚上面的操作",并且如果操作失败,在catch中也仅仅是记录了日志,并没有需要尝试重写的逻辑,(很有可能另外的某个程序或者某人,会定时查看日志,发现有错误就重新生成文件)也就是说,就这段代码而言,生成也可以算一个额外逻辑,那么自然也可以去异步操作.可是:千万注意!! vvgLinux联盟
   vvgLinux联盟
  由于生成报告需要的时间较长,那么生成报告的子线程会长时间运行,长期无法返回线程池,如果请求量太大,频率太快,那就会耗尽线程资源了. vvgLinux联盟
   vvgLinux联盟
  平心而论,这个问题其实不是异步造成的,即使时同步调用,执行此操作也需要化肥很长时间,调用量太大,频率太快,也会造成排队.而且由于返回时间太长,用户体验也不会好,所以我们的这个改造应该是有益的 vvgLinux联盟
   vvgLinux联盟
  (注:关于报告生成,我在与一个同事讨论这种思想的时候,他就认为这个地方应该有一个写入队列,因为显然生成文件的速度和其他处理速度是不匹配的,这确实是一个比较合理的做法) Linux联盟收集整理 ,转贴请标明原始链接,如有任何疑问欢迎来本站Linux论坛讨论
评论】【加入收藏夹】【 】【打印】【关闭
※ 相关链接
 ·WebBrowser屏幕滚动的实现,设置WebBrowser的焦点  (2007-12-13 12:54:43)
 ·在Web页上模拟(QQ)魔法表情  (2007-12-12 16:43:55)
 ·PHP中通过Web执行C/C++应用程序  (2007-12-03 15:55:58)
 ·Carello Web 使 ASP 源码暴露(APP,缺陷)-ASP漏洞集  (2007-12-03 15:27:29)
 ·通过asp入侵web server,窃取文件毁坏系统-ASP漏洞集  (2007-12-03 15:25:41)
 ·过asp入侵web server,窃取文件毁坏系统-ASP漏洞集  (2007-12-03 15:24:54)
 ·实现Web页面上的右键快捷菜单  (2007-11-30 13:11:04)
 ·调用IE内置打印组件完成web打印方案及例程  (2007-11-30 13:03:54)
 ·巧妙实现隐藏不想打印的web页面元素  (2007-11-30 13:01:57)
 ·webmin--基于Web的 Linux、Unix系统管理工具  (2007-11-29 11:46:03)