On my way of learning i read 2 article on these on MSDN magazine. Now this is really opening my eyes , giving me more enlighment. I know this before.
Don't know why when i look at it again today i grasp the understanding. Another article suggest us to carefully design and use this,when tested with stress tool you can see it also add overhead.
So use this Only for certain candidate for long length IO, Ex: webservicecall, Database access and other long process.
First let's understand How asp.net works for each request.

For each domain there's application pool . which initiate app and module and supply it for the each request. each request has it's own application and module. The size of this application pool is the same as your threadpool Default is 25.so by default, up to 25 requests per worker process can be processed concurrently, each with its own app and module set
<processModel enable="true"
•••
maxWorkerThreads="25"
maxIoThreads="25" />
IIS 6.0 supports application pools, which are groupings of applications
that will share a single worker process, now named w3pwp.exe.
Application pools give you the option of having as many distinct worker
processes as you want on any given server
After that let's understand How the synchronous Process of your Aspx page.

On synchronous page, it goes through the application cycle as usual. Imagine that you load a large bulk of data, or calling webservice which all of them is IO operation and took a while.
So the thread is used all the time till it finished , after finished it will return to the thread pool.Now how about on the heavy traffic scenario. if there's no available thread from threadpool it will throw server is busy.
Yes you can increase your worker process but that's going to be a temporary relief, increase hardware also. how about on our application? is there something that we can do. I Thought you never asked.
On Asynchronous Processing. The request come and then execute the beginasync operation and The Thread goes straight back to the Pool.
When the job is finished Asp.net Get another thread launch the endcallback and execute the lifecycle event PrerenderComplete to Render(on web form)
look at this picture

- On Webform you can use the
AddOnPreRenderCompleteAsync(new BeginEventHandler(BeginAsyncOperation),new EndEventHandler(EndAsyncOperation));
You can get the complete Finished result on PrerenderComplete Event
- As for httphandler you can implement IHttpAsyncHandler.
public void Init (HttpApplication application)
{
application.AddOnPreRequestHandlerExecuteAsync (
new BeginEventHandler (BeginPreRequestHandlerExecute),
new EndEventHandler (EndPreRequestHandlerExecute)
);
}
Now this lead us to a more scalable aspx and httphandler
Detail.
I've done a stress Test with LoadTest from VSTS.
1000 User,Browser Ie6,Ie7,FF3,Connection T3
The result is
With Async Page its 433 req/sec, avg pagetime 36.0 sec.
With Out Async Page 392 req/sec avg pagtetime 40.1 sec.