private void OnCompletedTask(TSource value, Task <TCollection> task) { switch (task.Status) { case TaskStatus.RanToCompletion: { var res = default(TResult); try { res = _parent._resultSelector(value, task.Result); } catch (Exception ex) { lock (_gate) { base._observer.OnError(ex); base.Dispose(); } return; } lock (_gate) base._observer.OnNext(res); OnCompleted(); } break; case TaskStatus.Faulted: { lock (_gate) { base._observer.OnError(task.Exception.InnerException); base.Dispose(); } } break; case TaskStatus.Canceled: { if (!_cancel.IsDisposed) { lock (_gate) { base._observer.OnError(new TaskCanceledException(task)); base.Dispose(); } } } break; } }
public void OnNext(TSource value) { var xs = default(IEnumerable <TCollection>); try { if (_parent._collectionSelectorE != null) { xs = _parent._collectionSelectorE(value); } else { checked { _indexInSource++; } xs = _parent._collectionSelectorEWithIndex(value, _indexInSource); } } catch (Exception exception) { base._observer.OnError(exception); base.Dispose(); return; } var e = default(IEnumerator <TCollection>); try { e = xs.GetEnumerator(); } catch (Exception exception) { base._observer.OnError(exception); base.Dispose(); return; } try { int indexInIntermediate = -1; var hasNext = true; while (hasNext) { hasNext = false; var current = default(TResult); try { hasNext = e.MoveNext(); if (hasNext) { if (_parent._resultSelector != null) { current = _parent._resultSelector(value, e.Current); } else { checked { indexInIntermediate++; } current = _parent._resultSelectorWithIndex(value, _indexInSource, e.Current, indexInIntermediate); } } } catch (Exception exception) { base._observer.OnError(exception); base.Dispose(); return; } if (hasNext) { base._observer.OnNext(current); } } } finally { if (e != null) { e.Dispose(); } } }