HttpApplication.CompleteRequest is preferable to use for aborting a request in an ASP.NET application over Response.End, because it has better performance characteristics. If you’re using Response.End, you’ve probably at one time or another encountered the ThreadAbortException that goes along with it.
The behavior of CompleteRequest changed with 2.0, as Rick describes here. However, the reason why you’ll most likely want to call CompleteRequest rather than Response.End is that, while it still short-circuits the ASP.NET pipeline (jumping immediately to the EndRequest event), it does so without throwing a ThreadAbortException.
(thanks to Stefan Schackow for this tip)