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); })); }