using System.Reactive.Linq;
using System.Reactive.Subjects;
using System.Reactive.Threading.Tasks;
using System.Reactive.Concurrency;
using System.Threading.Tasks;
public static void Main()
var source = Enumerable.Range(0, 1000).Select(i => (long)i);
var subject = new Subject<long>();
var cntTask = subject.Count().ToTask();
var sumTask = subject.Sum().ToTask();
var avgTask = subject.Average().ToTask();
Observable.Using(() => source.GetEnumerator(), enumerator =>
Observable.Defer(() => Observable.FromAsync(() => Task.FromResult(enumerator.MoveNext() ? enumerator.Current : -1)))
.ObserveOn(Scheduler.Default)
.TakeWhile(item => item != -1)
Console.WriteLine($"Count: {cntTask.Result:#,0}, Sum: {sumTask.Result:#,0}, Average: {avgTask.Result:#,0.0}");