title: Only implement an ASP.NET WebMethod asynchronously if you can parallelize?
body: <p>In <a href="http://msdn.microsoft.com/en-us/library/ms998549.aspx" rel="nofollow noreferrer">this</a> MSDN article (Chapter 6 — Improving ASP.NET Performance), it says the following:</p>
  <blockquote>
  <p><em><strong>&quot;Avoid Asynchronous Calls Unless You Have Additional Parallel Work</strong></em></p>
  <p><em>Make asynchronous calls from your Web application only when your application has additional parallel work to perform while it waits for the completion of the asynchronous calls, and the work performed by the asynchronous call is not CPU bound. <strong>Internally, the asynchronous calls use a worker thread from the thread pool; in effect, you are using additional threads.</strong></em></p>
  <p><em>At the same time that you make asynchronous I/O calls, such as calling a Web method or performing file operations, the thread that makes the call is released so that it can perform additional work, such as making other asynchronous calls or performing other parallel tasks. You can then wait for completion of all of those tasks. Making several asynchronous calls that are not CPU bound and then letting them run simultaneously can improve throughput.</em></p>
  </blockquote>
  <p>This is confusing to me.  My understanding was that when you make an asynchronous I/O call that no thread is used while waiting, but that an IOCP is set with a reference to your callback method.  Is it true that you should only use async calls when you have parallel work?  My understanding was that for an ASP.NET Web Service, it is often a good idea to change a WebMethod <strong>Foo</strong> to <strong>BeginFoo/EndFoo</strong> when you will be calling an I/O bound operation and implement the whole thing asynchronously.</p>
  <p>Can someone help me understand what is meant by “asynchronous calls use a worker thread from the thread pool; in effect, you are using additional threads”, and the difference between WorkerThreads and IO-threads?</p>