This is my one last try at understanding async-await. Am I correct?
<p>I think I finally understand it after the following paragraph</p>

<blockquote>
  <p>If you mark a method with or async modifier, you can use the await
  operator in the method. When control reaches an await expression in
  the async method, control returns to the caller, and progress in the
  method is suspended until the awaited task completes. When the task is
  complete, execution can resume in the method.</p>
</blockquote>

<p>which comes from <a href="http://blogs.msdn.com/b/csharpfaq/archive/2012/06/26/understanding-a-simple-async-program.aspx" rel="nofollow">http://blogs.msdn.com/b/csharpfaq/archive/2012/06/26/understanding-a-simple-async-program.aspx</a>. </p>

<p>So let's say I have a function</p>

<pre><code>public void Caller ( ) 
{
    Something1();
    SomeAsyncMethod();
    Something2();
    Something3();
    Something4();
}

public async void SomeAsyncMethod ( )
{
    Task&lt;string&gt; getWebPageTask = GetWebPageAsync("http://stackoverflow.com");
    Console.WriteLine("Begin");
    string task = await getWebPageTask;
    Console.WriteLine("End");
    // return 
}
</code></pre>

<p>and for the sake of argument let's say that the time it takes to complete <code>task</code> lines up where I specify below </p>

<pre><code>    Something2();
    Something3();
    // task would be done at this point
    Something4();
</code></pre>

<p>Then the flow of execution is actually like </p>

<pre><code>    Something1();
    Task&lt;string&gt; getWebPageTask = GetWebPageAsync("http://stackoverflow.com");
    Console.WriteLine("Begin");
    Something2();
    Something3();
    string task = [ string returned by GetWebPageAsync("http://stackoverflow.com") ] 
    Console.WriteLine("End");
    Something4();
</code></pre>

<p>So it's a lot like a <code>yield</code> statement in that the execution toggles between the caller of the method and the body of the method. </p>

<p>Do I understand it now?</p>