title: Why do i need to use ConfigureAwait(false) in all of transitive closure?
body: <p>I am learning async/await and after I read this article <a href="http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html" rel="noreferrer">Don't Block on Async Code</a></p>
  
  <p>and this <a href="https://stackoverflow.com/questions/14896856/is-async-await-suitable-for-methods-that-are-both-io-and-cpu-bound">Is async/await suitable for methods that are both IO and CPU bound</a></p>
  
  <p>I notice one Tip from @Stephen Cleary 's article.</p>
  
  <blockquote>
    <p>Using ConfigureAwait(false) to avoid deadlocks is a dangerous practice. You would have to use ConfigureAwait(false) for every await in the transitive closure of all methods called by the blocking code, including all third- and second-party code. Using ConfigureAwait(false) to avoid deadlock is at best just a hack).</p>
  </blockquote>
  
  <p>It appeared again in the code of the post as I have attached above.</p>
  
  <pre><code>public async Task&lt;HtmlDocument&gt; LoadPage(Uri address)
  {
      using (var httpResponse = await new HttpClient().GetAsync(address)
          .ConfigureAwait(continueOnCapturedContext: false)) //IO-bound
      using (var responseContent = httpResponse.Content)
      using (var contentStream = await responseContent.ReadAsStreamAsync()
          .ConfigureAwait(continueOnCapturedContext: false)) //IO-bound
          return LoadHtmlDocument(contentStream); //CPU-bound
  }
  </code></pre>
  
  <p>As my knowledge when we using ConfigureAwait(false)  the rest of async method will be run in the thread pool. Why we need to add it into every await 
  in transitive closure? I myself just think this is the correct version as what I knew.</p>
  
  <pre><code>public async Task&lt;HtmlDocument&gt; LoadPage(Uri address)
  {
      using (var httpResponse = await new HttpClient().GetAsync(address)
          .ConfigureAwait(continueOnCapturedContext: false)) //IO-bound
      using (var responseContent = httpResponse.Content)
      using (var contentStream = await responseContent.ReadAsStreamAsync()) //IO-bound
          return LoadHtmlDocument(contentStream); //CPU-bound
  }
  </code></pre>
  
  <p>It means the second use of ConfigureAwait(false) in using block is useless. Please tell me the correct way.
  Thanks in advance.</p>