public async Task ToAsyncEnumerable_Observable6_Async() { using var stop = new ManualResetEvent(false); var xs = new MyObservable <int>(obs => { var cts = new CancellationTokenSource(); Task.Run(async() => { for (var i = 0; !cts.IsCancellationRequested; i++) { await Task.Yield(); obs.OnNext(i); } stop.Set(); }); return(new MyDisposable(cts.Cancel)); }).ToAsyncEnumerable(); var e = xs.GetAsyncEnumerator(); for (var i = 0; i < 10_000; i++) { await HasNextAsync(e, i); } await e.DisposeAsync(); stop.WaitOne(); }
public async Task ToAsyncEnumerable_Observable_Cancel_InFlight() { var xs = new MyObservable <int>(obs => { var cts = new CancellationTokenSource(); Task.Run(async() => { for (var i = 0; !cts.IsCancellationRequested; i++) { await Task.Delay(10); obs.OnNext(i); } }); return(new MyDisposable(cts.Cancel)); }).ToAsyncEnumerable(); using var c = new CancellationTokenSource(); await using var e = xs.GetAsyncEnumerator(c.Token); var task = e.MoveNextAsync(); c.Cancel(); await AssertThrowsAsync <TaskCanceledException>(task.AsTask()); }
public async Task ToAsyncEnumerable_Observable_Throw() { var ex = new Exception("Bang!"); var subscribed = false; var xs = new MyObservable <int>(obs => { subscribed = true; obs.OnError(ex); return(new MyDisposable(() => { })); }).ToAsyncEnumerable(); Assert.False(subscribed); var e = xs.GetAsyncEnumerator(); // NB: Breaking change to align with lazy nature of async iterators. // Assert.True(subscribed); await AssertThrowsAsync(e.MoveNextAsync(), ex); }
public async Task ToAsyncEnumerable_Observable_Return() { var subscribed = false; var xs = new MyObservable <int>(obs => { subscribed = true; obs.OnNext(42); obs.OnCompleted(); return(new MyDisposable(() => { })); }).ToAsyncEnumerable(); Assert.False(subscribed); var e = xs.GetAsyncEnumerator(); // NB: Breaking change to align with lazy nature of async iterators. // Assert.True(subscribed); await HasNextAsync(e, 42); await NoNextAsync(e); }