title: Why does the Task.WhenAny not throw an expected TimeoutException?
body: <p>Please, observe the following trivial code:</p>
  
  <pre><code>class Program
  {
      static void Main()
      {
          var sw = new Stopwatch();
          sw.Start();
          try
          {
              Task.WhenAny(RunAsync()).GetAwaiter().GetResult();
          }
          catch (TimeoutException)
          {
              Console.WriteLine("Timed out");
          }
          Console.WriteLine("Elapsed: " + sw.Elapsed);
          Console.WriteLine("Press Enter to exit");
          Console.ReadLine();
      }
  
      private static async Task RunAsync()
      {
          await Observable.StartAsync(async ct =&gt;
          {
              for (int i = 0; i &lt; 10; ++i)
              {
                  await Task.Delay(500, ct);
                  Console.WriteLine("Inside " + i);
              }
              return Unit.Default;
          }).Timeout(TimeSpan.FromMilliseconds(1000));
      }
  }
  </code></pre>
  
  <p>Running it outputs:</p>
  
  <pre><code>Inside 0
  Inside 1
  Elapsed: 00:00:01.1723818
  Press Enter to exit
  </code></pre>
  
  <p>Note, no <strong>Timed out</strong> message.</p>
  
  <p>Now, if I replace <code>Task.WhenAny</code> with <code>Task.WhenAll</code> here is what I get:</p>
  
  <pre><code>Inside 0
  Inside 1
  Timed out
  Elapsed: 00:00:01.1362188
  Press Enter to exit
  </code></pre>
  
  <p>Note the presence of the <strong>Timed out</strong> message this time.</p>
  
  <p>And, if I remove the <code>Task.WhenAll</code> wrapper at all and call <code>RunAsync</code> directly:</p>
  
  <pre><code>Inside 0
  Inside 1
  Timed out
  Elapsed: 00:00:01.1267617
  Press Enter to exit
  </code></pre>
  
  <p>The <strong>Timed out</strong> message is there, as expected.</p>
  
  <p>So what is the deal with <code>Task.WhenAny</code> ? It obviously interrupts the asynchronous method, but where is the <code>TimeoutException</code>?</p>