title: Async/Await and Web API blocks execution
body: <p>I have the following in my REST API server(using OWIN):</p>
  
  <pre><code>    [ResponseType(typeof(Session))]
      [Route("api/v1/async")]
      public Session async_status()
      {
          AsyncStatus();
          return new Session() {...};
      }
  
      private async Task&lt;int&gt; AsyncStatus()
      {
          await SyncMethod();
          return 42;
      }
  
      private Task&lt;int&gt; SyncMethod()
      {
          CopyFileThatTakesALongTime(....);
          // OR
          Thread.Sleep(60000);
          return Task.FromResult(42);
      }
  </code></pre>
  
  <p>Why dies it block and the client does not get the desired asynchronous-ness. I I would expect that when calling: </p>
  
  <pre><code>await SyncMethod();
  </code></pre>
  
  <p>The caller would be freed and unblocked while the rest of the sleep would be executed. What am i missing?</p>
  
  <p>P.S: I can easily fix it by replacing this:</p>
  
  <pre><code>AsyncStatus();
  </code></pre>
  
  <p>With:</p>
  
  <pre><code>Task.Run(() =&gt; AsyncStatus() );
  </code></pre>
  
  <p>The reason i am not doing that is because of this reading:</p>
  
  <blockquote>
    <blockquote>
      <p><a href="https://blog.stephencleary.com/2013/11/taskrun-etiquette-examples-using.html" rel="nofollow noreferrer">https://blog.stephencleary.com/2013/11/taskrun-etiquette-examples-using.html</a></p>
    </blockquote>
  </blockquote>
  
  <p>In other words if it's bad to use Task.Run() in a web server as in the above article but you can't use async/await, what is the solution?</p>