小谈asp.net页面周期及加速策略
(注意:文章多线程加速策略借用了Ultra-fast asp.net一书的一小部分文章,并非本人原创)
ASP.net整个的页面周期如下所示,其中,render阶段是每个控件调用自己的render方法把自己呈现在页面上,除此之外其他所有阶段都包含一个句柄,可供外部进行事件响应。
正常的状态下,ASP.NET整个的页面周期占用了一个单独的线程。所以,我们可以通过多线程进行加速:把页面周期分为2个线程来执行。
如下图:
什么时候我们要使用多线程的页面周期?
如果某些页面的某些操作执行时间过长,就可以考虑采用多线程,这些操作比如有:数据库读写,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强烈的运转导致没有间歇的时间,那么使用同步任务将引带来额外性能瓶颈,这是绝对要避免的。