llopx

能跟您分享知识,是我的荣幸

小谈asp.net页面周期及加速策略

(注意:文章多线程加速策略借用了Ultra-fast asp.net一书的一小部分文章,并非本人原创)

 

ASP.net整个的页面周期如下所示,其中,render阶段是每个控件调用自己的render方法把自己呈现在页面上,除此之外其他所有阶段都包含一个句柄,可供外部进行事件响应。

 

image

 

 

正常的状态下,ASP.NET整个的页面周期占用了一个单独的线程。所以,我们可以通过多线程进行加速:把页面周期分为2个线程来执行。

 

如下图:

image

 

什么时候我们要使用多线程的页面周期?

如果某些页面的某些操作执行时间过长,就可以考虑采用多线程,这些操作比如有:数据库读写,IO操作,webservice等。

 

 

下面是一个例子:

在page_load的时候,注册一个新线程:

        protected void Page_Load(object sender, EventArgs e)
        {
            PageAsyncTask pat =
            new PageAsyncTask(BeginAsync, EndAsync, null, null, true);
            this.RegisterAsyncTask(pat); 
        }

然后是同步开始、结束调用的方法:

     private IAsyncResult BeginAsync(object sender, EventArgs e,
       AsyncCallback cb, object state)
        {
            SqlConnection conn = new SqlConnection(ConnString);
            conn.Open();
            SqlCommand cmd = new SqlCommand("WAITFOR DELAY '00:00:01'", conn);
            IAsyncResult ar = cmd.BeginExecuteNonQuery(cb, cmd);
            return ar;
        }

        private void EndAsync(IAsyncResult ar)
        {
            using (SqlCommand cmd = (SqlCommand)ar.AsyncState)
            {
                using (cmd.Connection)
                {
                    int rows = cmd.EndExecuteNonQuery(ar);
                }
            }
        } 

原则:分掉一个线程是为了让某线程在等待页面某个耗时操作的空闲时间,去做其他的事情。但是如果web应用程序线程已经非常的繁忙,CPU强烈的运转导致没有间歇的时间,那么使用同步任务将引带来额外性能瓶颈,这是绝对要避免的

posted on 2009-12-28 21:32  llopx  阅读(398)  评论(0编辑  收藏  举报

导航