using System.Reactive.Linq;
using System.Threading.Tasks;
public static void Main()
var cts = new CancellationTokenSource(500);
cts.Token.Register(() => Console.WriteLine("### Token Canceled! ###"));
.Timer(TimeSpan.Zero, TimeSpan.FromMilliseconds(1000))
.TakeUntil(Observable.Create<Unit>(observer =>
Console.WriteLine("Before observer.OnNext");
observer.OnNext(Unit.Default);
Console.WriteLine("After observer.OnNext");
return Observable.StartAsync(async () =>
Console.WriteLine("Action starting");
await Task.Delay(1000, cts.Token);
catch (Exception ex) { Console.WriteLine("Failed: {0}", ex.Message); }
Console.WriteLine("Finished");