public async ValueTask SubscribeAsync(IAsyncObserver <T> observer) { var disposable = new BooleanDisposable(); await observer.OnSubscribeAsync(disposable).ConfigureAwait(false); if (!disposable.IsDisposed) { await observer.OnErrorAsync(_exception).ConfigureAwait(false); } await observer.OnFinallyAsync().ConfigureAwait(false); }
public async ValueTask SubscribeAsync(IAsyncObserver <T> observer) { var disposable = new BooleanDisposable(); await observer.OnSubscribeAsync(disposable).ConfigureAwait(false); try { if (!disposable.IsDisposed) { await observer.OnCompletedAsync().ConfigureAwait(false); } } finally { await observer.OnFinallyAsync().ConfigureAwait(false); } }
public async ValueTask SubscribeAsync(IAsyncObserver <T> observer) { var disposable = new AwaitableDisposable(); await observer.OnSubscribeAsync(disposable).ConfigureAwait(false); try { // AwaitableDisposable will not throw, hence we // do not need to follow the try finally pattern. // We do it nonetheless to be consistent. await disposable.Task.ConfigureAwait(false); } finally { await observer.OnFinallyAsync().ConfigureAwait(false); } }
public async ValueTask SubscribeAsync(IAsyncObserver <T> observer) { var disposable = new BooleanDisposable(); try { await observer.OnSubscribeAsync(disposable).ConfigureAwait(false); var items = await _enumerable.ConfigureAwait(false); foreach (var item in items) { if (disposable.IsDisposed) { break; } var t = observer.OnNextAsync(item); try { await t.ConfigureAwait(false); } catch (Exception ex) { await observer.OnErrorAsync(ex).ConfigureAwait(false); break; } } if (!disposable.IsDisposed) { await observer.OnCompletedAsync().ConfigureAwait(false); } } finally { await observer.OnFinallyAsync().ConfigureAwait(false); } }
public async ValueTask SubscribeAsync(IAsyncObserver <T> observer) { var disposable = new SerialDisposable(); await observer.OnSubscribeAsync(disposable).ConfigureAwait(false); foreach (var obs in _observables) { if (disposable.IsDisposed) { break; } var inner = new Observer(observer); try { await obs.SubscribeAsync(inner).ConfigureAwait(false); } catch (Exception ex) { await observer.OnErrorAsync(ex).ConfigureAwait(false); disposable.Dispose(); break; } if (inner.Faulted) { disposable.Dispose(); break; } } if (!disposable.IsDisposed) { await observer.OnCompletedAsync().ConfigureAwait(false); } await observer.OnFinallyAsync().ConfigureAwait(false); }
public async ValueTask SubscribeAsync(IAsyncObserver <int> observer) { var disposable = new BooleanDisposable(); await observer.OnSubscribeAsync(disposable).ConfigureAwait(false); try { for (int i = _start; i < _end; i++) { if (disposable.IsDisposed) { break; } var t = observer.OnNextAsync(i); try { await t.ConfigureAwait(false); } catch (Exception ex) { await observer.OnErrorAsync(ex).ConfigureAwait(false); break; } } if (!disposable.IsDisposed) { await observer.OnCompletedAsync().ConfigureAwait(false); } } finally { await observer.OnFinallyAsync().ConfigureAwait(false); } }
public async ValueTask SubscribeAsync(IAsyncObserver <T> observer) { var disposable = new BooleanDisposable(); await observer.OnSubscribeAsync(disposable).ConfigureAwait(false); try { if (disposable.IsDisposed) { return; } var t = observer.OnNextAsync(_value); try { await t.ConfigureAwait(false); } catch (Exception ex) { if (!disposable.IsDisposed) { await observer.OnErrorAsync(ex).ConfigureAwait(false); } return; } if (!disposable.IsDisposed) { await observer.OnCompletedAsync().ConfigureAwait(false); } } finally { await observer.OnFinallyAsync().ConfigureAwait(false); } }
public async ValueTask Run() { await _observer.OnSubscribeAsync(this).ConfigureAwait(false); try { var done = false; while (true) { while (true) { if (IsCanceled) { return; } done = Volatile.Read(ref _done); if (_queue.TryDequeue(out var item)) { var t = _observer.OnNextAsync(item); try { await t.ConfigureAwait(false); } catch (Exception ex) { await _observer.OnErrorAsync(ex).ConfigureAwait(false); return; } } else { break; } } if (done) { break; } await ResumeHelper.Await(ref _tcs).ConfigureAwait(false); ResumeHelper.Clear(ref _tcs); } if (!IsCanceled) { if (_error == null) { await _observer.OnCompletedAsync().ConfigureAwait(false); } else { await _observer.OnErrorAsync(_error).ConfigureAwait(false); } } Dispose(); } finally { await _observer.OnFinallyAsync().ConfigureAwait(false); } }