Example #1
0
        public static IObservable <byte> ToObservable(
            this FileStream source,
            int buffersize,
            IScheduler scheduler)
        {
            var bytes = Observable.Create <byte>(o =>
            {
                var initialState             = new StreamReaderState(source, buffersize);
                var currentStateSubscription = new SerialDisposable();
                Action <StreamReaderState, Action <StreamReaderState> > iterator =
                    (state, self) =>
                    currentStateSubscription.Disposable = state.ReadNext()
                                                          .Subscribe(
                        bytesRead =>
                {
                    for (int i = 0; i < bytesRead; i++)
                    {
                        o.OnNext(state.Buffer[i]);
                    }
                    if (bytesRead > 0)
                    {
                        self(state);
                    }
                    else
                    {
                        o.OnCompleted();
                    }
                },
                        o.OnError);
                var scheduledWork = scheduler.Schedule(initialState, iterator);
                return(new CompositeDisposable(currentStateSubscription, scheduledWork));
            });

            return(Observable.Using(() => source, _ => bytes));
        }
    public static IObservable <byte> ToObservable(this FileStream source, int buffersize, IScheduler scheduler)
    {
        return(Observable.Create <byte>(o =>
        {
            var initialState = new StreamReaderState(source, buffersize);
            var subscription = new MultipleAssignmentDisposable();
            Action <StreamReaderState, Action <StreamReaderState> > action =
                (state, self) =>
            {
                subscription.Disposable = state.ReadNext()
                                          .Subscribe(
                    bytesRead =>
                {
                    for (int i = 0; i < bytesRead; i++)
                    {
                        o.OnNext(state.Buffer[i]);
                    }
                    if (bytesRead > 0)
                    {
                        self(state);
                    }
                    else
                    {
                        o.OnCompleted();
                    }
                },
                    o.OnError);
            };

            var scheduledAction = scheduler.Schedule(initialState, action);
            return new CompositeDisposable(scheduledAction, subscription);
        }));
    }