Пример #1
0
            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;
                }
            }
Пример #2
0
            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();
                    }
                }
            }