网站导航免费论文 原创论文 论文搜索 原创论文 网学软件 学术大家 资料中心 会员中心 问题解答 原创论文 大学论文导航 设计下载 最新论文 下载排行 原创论文 论文源代码
返回网学首页
网学联系
最新论文 推荐专题 热门论文 素材专题
当前位置: 网学 > 编程文档 > ASP.net > 正文

详细解读ASP.NET的异步

来源:http://myeducs.cn 联系QQ:点击这里给我发消息 作者: 用户投稿 来源: 网络 发布时间: 13/01/05
产生线程3个,总用时0.236秒。

根据以上的数据,我们可以得出结论,要提高系统响应时间与并发处理数,应尽可能减少WEB线程的等待。

【略】请各位自行查验当一次并发全部处理完毕后再次测试的处理情况。

【略】请各位自行查验当处理程序中使用线程池处理等待任务的处理情况。

如何减少WEB线程的等待呢,那就应该尽早的结果ProcessRequest方法,前一篇中讲到,对于一些需要等待完成的任务,可以使用异步方法来做,于是我们可以在ProcessRequest中调用异步方法,但问题是当ProcessRequest结束后,请求处理也即将结束,一但请求结束,将没有办法在这一次请求中返回结果给客户端,但是此时,异步任务还没有完成,当异步任务完成时,也许再也没有办法将结果传给客户端了。(难道用轮询?囧)

我们需要的方案是,处理请求时可以暂停处理(不是暂停线程),并保持客户端连接,在需要时,向客户端输出结果,并结束请求。

498)this.width=498;'' onmousewheel = ''javascript:return big(this)'' alt="" src="/uploadfile/201301/5/6E15529419.png" />

在这个模型中,可以看到,对于WebServerRuntime来说,我们的请求处理程序就是一个异步方法,而对于客户端来说,却并不知道后面的处理情况。无论在WebServerRuntime或是我们的处理程序,都没有直接占用线程,一切由何时SetComplete决定。同时可以看到,这种模式需要WebServerRuntime的紧密配合,提供调用异步方法的接口。在ASP.NET中,这个接口就是IHttpAsyncHandler。

异步ASP.NET处理程序

首先,我们来实现第一个异步处理程序,在适当的时候触发结束,在开始和结束时输出一些信息。 

  1. public class Handler : IHttpHandler, IHttpAsyncHandler  
  2. {  
  3.     public void ProcessRequest(HttpContext context)  
  4.     {  
  5.         //异步处理器不执行该方法  
  6.     }  
  7.  
  8.     public bool IsReusable  
  9.     {  
  10.         //设置允许重用对象  
  11.         get { return false; }  
  12.     }  
  13.       
  14.     //请求开始时由ASP.NET调用此方法  
  15.     public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData)  
  16.     {  
  17.         context.Response.ContentType = "text/xml";  
  18.         context.Response.Write("App:");  
  19.         context.Response.Write(context.ApplicationInstance.GetHashCode());  
  20.         context.Response.Write("\tBegin:");  
  21.         context.Response.Write(DateTime.Now.ToString("mm:ss,ffff"));  
  22.         //输出当前线程  
  23.         context.Response.Write("\tThreadId:");  
  24.         context.Response.Write(Thread.CurrentThread.ManagedThreadId);  
  25.         //构建异步结果并返回  
  26.         var result = new WebAsyncResult(cb, context);  
  27.         //用一个定时器来模拟异步触发完成  
  28.         Timer timer = null;  
  29.         timer = new Timer(o =>  
  30.         {  
  31.             result.SetComplete();  
  32.             timer.Dispose();  
  33.         }, null, TimeSpan.FromSeconds(5), TimeSpan.FromSeconds(5));  
  34.         return result;  
  35.     }  
  36.  
  37.     //异步结束时,由ASP.NET调用此方法  
  38.     public void EndProcessRequest(IAsyncResult result)  
  39.     {  
  40.         WebAsyncResult webresult = (WebAsyncResult)result;  
  41.         webresult.Context.Response.Write("\tEnd:");  
  42.         webresult.Context.Response.Write(DateTime.Now.ToString("mm:ss,ffff"));  
  43.         //输出当前线程  
  44.         webresult.Context.Response.Write("\tThreadId:");  
  45.         webresult.Context.Response.Write(Thread.CurrentThread.ManagedThreadId);  
  46.     }  
  47.  
  48.     //WEB异步方法结果  
  49.     class WebAsyncResult : IAsyncResult  
  50.     {  
  51.         private AsyncCallback _callback;  
  52.  
  53.         public WebAsyncResult(AsyncCallback cb, HttpContext context)  
  54.         {  
  55.             Context = context;  
  56.             _callback = cb;  
  57.         }  
  58.  
  59.         //当异步完成时调用该方法  
  60.         public void SetComplete()  
  61.         {  
  62.             IsCompleted = true;  
  63.             if (_callback != null)  
  64.             {  
  65.                 _callback(this);  
  66.             }  
  67.         }  
  68.  
  69.         public HttpContext Context  
  70.         {  
  71.             get;  
  72.             private set;  
  73.         }  
  74.  
  75.         public object AsyncState  
  76.         {  
  77.             get { return null; }  
  78.         }  
  79.  
  80.         //由于ASP.NET不会等待WEB异步方法,所以不使用此对象  
  81.         public WaitHandle AsyncWaitHandle  
  82.         {  
  83.             get { throw new NotImplementedException(); }  
  84.         }  
  85.  
  86.         public bool CompletedSynchronously  
  87.         {  
  88.             get { return false; }  
  89.         }  
  90.  
  91.         public bool IsCompleted  
  92.         {  
  93.             get;  
  94.             private set;  
  95.         }  
  96.     }  

  • 上一篇资讯: ASP.NET显示渐变图片
  • 网学推荐

    免费论文

    原创论文

    设为首页 | 加入收藏 | 论文首页 | 论文专题 | 设计下载 | 网学软件 | 论文模板 | 论文资源 | 程序设计 | 关于网学 | 站内搜索 | 网学留言 | 友情链接 | 资料中心
    版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
    Copyright 2008-2015 myeducs.Cn www.myeducs.Cn All Rights Reserved 湘ICP备09003080号