title: Observable.Create: CancellationToken doesn't transition to IsCancellationRequested
body: <p>Take this little script (designed in LINQPad but should run everywhere):</p>
  
  <pre><code>void Main()
  {
      Task.Run(() =&gt; Worker()).Wait();
  }
  
  async Task Worker()
  {
      if (SynchronizationContext.Current != null)
          throw new InvalidOperationException("Don't want any synchronization!");
  
      BaseClass provider = new Implementation();
      Func&lt;IObserver&lt;TimeSpan&gt;, CancellationToken, Task&gt; subscribeAsync =
          provider.CreateValues;
      var observable = Observable.Create(subscribeAsync);
  
      var cancellation = new CancellationTokenSource(5500).Token; // gets cancelled after 5.5s
      cancellation.Register(() =&gt; Console.WriteLine("token is cancelled now"));
      await observable
          .Do(ts =&gt;
          {
              Console.WriteLine("Elapsed: {0}; cancelled: {1}",
                  ts,
                  cancellation.IsCancellationRequested);
              cancellation.ThrowIfCancellationRequested();
          })
          .ToTask(cancellation)
          .ConfigureAwait(false);
  }
  
  abstract class BaseClass
  {
      // allow implementers to use async-await
      public abstract Task CreateValues(IObserver&lt;TimeSpan&gt; observer, CancellationToken cancellation);
  }
  
  class Implementation : BaseClass
  {
      // creates Values for 10s; entirely CPU-bound: no way for async-await hence return Task.CompletedTask
      public override Task CreateValues(IObserver&lt;TimeSpan&gt; observer, CancellationToken cancellation)
      {
          try
          {
              var sw = Stopwatch.StartNew();
              for (int i = 0; i &lt; 10; i++)
              {
                  for (int j = 0; j &lt; 3; j++)
                  {
                      Console.WriteLine("{0}/{1} cancelled:{2}", i, j, cancellation.IsCancellationRequested);
                      Thread.Sleep(333);
                  }
  
                  if (cancellation.IsCancellationRequested) // !! never gets true !!
                      throw new ApplicationException("token is cancelled");
  
                  observer.OnNext(sw.Elapsed);
              }
  
              return Task.CompletedTask;
          }
          catch (Exception ex)
          {
              Console.WriteLine(ex);
              throw;
          }
      }
  }
  </code></pre>
  
  <p>The method <code>Implementation.CreateValues</code> justs keeps running for the entire 10 seconds instead of stopping after 5.5s. The <code>CancellationToken</code> passed in by <code>Observable.Create</code> doesn't even transition to a cancelled state (the original token of course does)!</p>
  
  <p><strong>Is it a bug? Is it my fault by doing something wrong?</strong></p>
  
  <p>Output is:</p>
  
  <pre><code>0/0 cancelled:False
  0/1 cancelled:False
  0/2 cancelled:False
  Elapsed: 00:00:01.0205951; cancelled: False
  1/0 cancelled:False
  1/1 cancelled:False
  1/2 cancelled:False
  Elapsed: 00:00:02.0253279; cancelled: False
  2/0 cancelled:False
  2/1 cancelled:False
  2/2 cancelled:False
  Elapsed: 00:00:03.0274035; cancelled: False
  3/0 cancelled:False
  3/1 cancelled:False
  3/2 cancelled:False
  Elapsed: 00:00:04.0294796; cancelled: False
  4/0 cancelled:False
  4/1 cancelled:False
  4/2 cancelled:False
  Elapsed: 00:00:05.0315332; cancelled: False
  5/0 cancelled:False
  5/1 cancelled:False
  token is cancelled now
  5/2 cancelled:False
  Elapsed: 00:00:06.0335601; cancelled: True
  6/0 cancelled:False
  6/1 cancelled:False
  6/2 cancelled:False
  Elapsed: 00:00:07.0436211; cancelled: True
  7/0 cancelled:False
  7/1 cancelled:False
  7/2 cancelled:False
  Elapsed: 00:00:08.0457921; cancelled: True
  8/0 cancelled:False
  8/1 cancelled:False
  8/2 cancelled:False
  Elapsed: 00:00:09.0477509; cancelled: True
  9/0 cancelled:False
  9/1 cancelled:False
  9/2 cancelled:False
  Elapsed: 00:00:10.0498751; cancelled: True
  [AggregateException] at Main/Task.Wait()
  </code></pre>