Asynchronous support has always been avaialble to ASP.NET through the use of HTTP Handlers, but those can be quite the bad time.  Now, ASP.NET 2.0 makes it really easy.  Start by adding the following to your compiler directive.
 
<%@ Page Async='True" ... %>
 
Then sometime before the page's OnPreRenderComplete event (refer to the new Page LifeCycle), you register a begin and end method.  To do this you call the Page object's AddOnPreRenderCompleteAsync method and pass in delegates pointing to the methods for begin and end.
 
For example
 
protected void OnLoad(object sender, EventArgs e)
{
    AddOnPreRenderComplete(new BeginEventHandler(BeginAsyncOperation), new EndEventHandler(EndAsyncOperation));
}
 
Your begin and end methods then start their asynchonous operations.  This could be data access, or whatever you might want to do asynchronously.

Read the complete post at http://www.dotnettipoftheday.com/blog.aspx?id=124