• ASP.NET 异步页面


    1、同步和异步的区别

    当未使用异步页时,一个线程只能为同一个页面的请求服务. 即使页面请求过程中处理其它的I/O等操作时,此线程也一直处于等待状态. 当此页面使用完此线程时,才将它放回到线程池. 线程数量是有限的! 所以当不使用线程时及时放回线池可以使系统性能大大提高!
    当使用了异步页功能时,如右图中,开始Thread1是为页面服务的,但当页面处理其它的事情(比如I/O或调用其它WebService) 时,Thread1被放回线程池, 此时Thread1可以为其它页面请求服务了. 当此页面执行完自己的操作回来后, Thread2接着为页面请求服务,并不是使用的原来的线程Thread1. 这样网站的伸缩性会更好.

    image

    2、使用示例

    public partial class _Default : System.Web.UI.Page
    {
        const string RSSFEED = "http://weblogs.asp.net/scottgu/rss.aspx";
        private WebRequest req;
        public string rssResult;
        public int tick;
        protected void Page_Load(object sender, EventArgs e)
        {
            int started = System.Environment.TickCount;
            AddOnPreRenderCompleteAsync(
                new BeginEventHandler(BeginTask),
                new EndEventHandler(EndTask));
    
            tick = System.Environment.TickCount - started;
    
            //PageAsyncTask task = new PageAsyncTask(
            //    new BeginEventHandler(BeginTask),
            //    new EndEventHandler(EndTask),
            //    new EndEventHandler(TimeOut),
            //    null);
    
    
            //RegisterAsyncTask(task);
    
        }
    
        IAsyncResult BeginTask(object sender, EventArgs e, AsyncCallback cb, object state)
        {
            Trace.Warn("Begin asyc: Thread=" + Thread.CurrentThread.ManagedThreadId.ToString());
    
            req = WebRequest.Create(RSSFEED);
            return req.BeginGetResponse(cb, state);
        }
    
        void EndTask(IAsyncResult ar)
        {
    
            using (WebResponse response = req.EndGetResponse(ar))
            {
                StreamReader reader;
                using (reader = new StreamReader(response.GetResponseStream()))
                {
                    rssResult = reader.ReadToEnd();
                }
    
            }
    
            Trace.Warn("End async: Thread=" + Thread.CurrentThread.ManagedThreadId.ToString());
        }
    
        void TimeOut(IAsyncResult ar)
        {
            Response.Write("Time Out");
            Response.End();
        }
        }

    前台页面

    image

    image

  • 相关阅读:
    项目开发日志——第三篇
    项目开发日志——第二篇
    项目开发日志——第一篇
    实时控制软件设计第四周作业
    实时控制软件设计第三周作业
    实时控制软件设计第二周作业
    关于开放式CNC系统实时软件控制系统的一些简单分析
    初学者的卡尔曼滤波——扩展卡尔曼滤波(一)
    C++_Eigen函数库用法笔记——The Array class and Coefficient-wise operations
    C++_Eigen函数库用法笔记——Block Operations
  • 原文地址:https://www.cnblogs.com/cnblogsfans/p/1596619.html
Copyright © 2020-2023  润新知