title: async/await whenall does return immediately
body: <p>I have this "simple" test code... (Don't bother the strange use of the Class methods...) </p>
  
  <p>I am trying to grasp the <code>Task&lt;&gt;</code> intricacies... I think I have a little understanding of <code>Task&lt;&gt;.Start()</code>/<code>Task&lt;&gt;.Result</code> pattern (maybe as it resembles more the 'old' <code>Thread.Start()</code>?) but as soon as it seems to me to grasp something (and so I throw in the <code>await</code> keyword)... then all entangles again :-(</p>
  
  <p>Why my code returns immediately after the first task completes? Why it doesn't wait on the <code>Task.WhenAll()</code>?</p>
  
  <pre><code>static BigInteger Factorial(BigInteger factor)
  {
      BigInteger factorial = 1;
      for (BigInteger i = 1; i &lt;= factor; i++)
      {
          factorial *= i;
      }
      return factorial;
  }
  
  private class ChancesToWin
  {
      private int _n, _r;
  
      public ChancesToWin(int n, int r)
      {
          _n = n;
          _r = r;
      }
  
      private Task&lt;BigInteger&gt; CalculateFactAsync(int value)
      {
          return Task.Factory.StartNew&lt;BigInteger&gt;(() =&gt; Factorial(value));
      }
  
      public async Task&lt;BigInteger&gt; getFactN()
      {
          BigInteger result = await CalculateFactAsync(_n);
          return result;
      }
  
      public async Task&lt;BigInteger&gt; getFactN_R()
      {
          BigInteger result = await CalculateFactAsync(_n - _r);
          return result;
      }
  
      public async Task&lt;BigInteger&gt; getFactR()
      {
          BigInteger result = await CalculateFactAsync(_r);
          return result;
      }
  
  }
  
  private async static void TaskBasedChancesToWin_UseClass()
  {
      int n = 69000;
      int r = 600;
  
      List&lt;Task&lt;BigInteger&gt;&gt; tasks = new List&lt;Task&lt;BigInteger&gt;&gt;();
  
      ChancesToWin ctw = new ChancesToWin(n, r);
  
      tasks.Add(ctw.getFactN());
      tasks.Add(ctw.getFactN_R());
      tasks.Add(ctw.getFactR());
  
      // The getFactR() returns first of the other two tasks... and the code exit!
      BigInteger[] results = await Task.WhenAll(tasks);
  
      // I don't get here !!!!
      BigInteger chances = results[0] / results[1] * results[2];
  
      //Debug.WriteLine(chances);
  }
  
  static void Main(string[] args)
  {
      TaskBasedChancesToWin_UseClass();
  }
  </code></pre>