ASP.NET Asynchronous Pages and when to use them
There have been several articles posted about using
asynchronous pages in ASP.NET but none of them go into
detail as to when you should use them. I finally saw a great
post by Thomas Marquardt that explains the process in depth.
He addresses a key misconception too:
So, in your ASP.NET application, when should you perform
work asynchronously instead of synchronously? Well,
only 1 thread per CPU can execute at a time. Did you catch that? A lot of people seem to miss this
point...only one thread executes at a time on a CPU. When
you have more than this, you pay an expensive penalty--a
context switch. However, if a thread is blocked waiting on
work...then it makes sense to switch to another thread,
one that can execute now. It also makes sense to switch
threads if you want work to be done in parallel as opposed
to in series, but up until a certain point it actually
makes much more sense to execute work in series, again,
because of the expensive context switch.
Pop
quiz:
If you have a thread that is doing a lot of
computational work and using the CPU heavily, and this
takes a while, should you switch to another thread?
No!
The current thread is efficiently using the CPU, so
switching will only incur the cost of a context switch.
Ok, well,
what if you have a thread that makes an HTTP or SOAP
request to another server and takes a long time, should
you switch threads? Yes!
You can perform the HTTP or SOAP request asynchronously,
so that once the "send" has occurred, you can unwind the
current thread and not use any threads until there is an
I/O completion for the "receive". Between the "send" and
the "receive", the remote server is busy, so locally you
don't need to be blocking on a thread, but instead make
use of the asynchronous APIs provided in .NET Framework so
that you can unwind and be notified upon completion.
Again, it only makes sense to switch threads if the
benefit from doing so out weights the cost of the
switch.
Read more about it in these posts:
Performing Asynchronous Work, or Tasks, in ASP.NET
Applications
http://blogs.msdn.com/tmarq/archive/2010/04/14/performing-asynchronous-work-or-tasks-in-asp-net-applications.aspx
ASP.NET Thread Usage on IIS 7.0 and 6.0
http://blogs.msdn.com/tmarq/archive/2007/07/21/asp-net-thread-usage-on-iis-7-0-and-6-0.aspx
PS: I generally do not write posts that simply link to other posts but think it is warranted in this case.