private void StartExecution() { while (!_cancellationToken.IsCancellationRequested) { _manualResetEvent.WaitOne(); while (_executionQueue.Count > 0) { ObserverItem item = default; lock (_lock) { item = _executionQueue.Dequeue(); } //we can get an exception here if item in queue is bad //NRE for example if (item.HasException) { _observer.OnError(item.Exception); } else if (!item.IsLastElement) { _observer.OnNext(item.Value); } else { _observer.OnCompleted(); //we do nothing, when execution was completed //in theory we can still receive items, but I'm not process it, because this class just a wrapper for background consuming } } _manualResetEvent.Reset(); } }
public IDisposable Subscribe(IObserver <T> observer) { ObserverItem item = new ObserverItem(observer, this); _observerItems.Add(item); return(item); }
private void Enqueue(ObserverItem item) { lock (_lock) { _executionQueue.Enqueue(item); } _manualResetEvent.Set(); }
public void EnqueueLast() => Enqueue(ObserverItem.FromLast());
public void EnqueueError(Exception exception) => Enqueue(ObserverItem.FromException(exception));
public void EnqueueNext(T value) => Enqueue(ObserverItem.FromValue(value));