static void TestSequenceOrder(YieldingDispatcher dispatcher, ISubject <int> sub, IObservable <int> obs) { IList <int> result = null; obs.SelectMany(i => Observable.FromAsync(() => dispatcher.InvokeAsync( () => { Thread.Sleep(100); return(i); }))) .Buffer(2) .Subscribe( l => { result = l; }); sub.OnNext(1); dispatcher.FlushNoneBlocking(); // This is the key here, we start processing item '1' before we add item '2' sub.OnNext(2); while (result == null) { dispatcher.Flush(); Thread.Sleep(1); } Assert.True(result.Count == 2, "Unexpected number of items in observable sequence. Was expecting 2"); Assert.True(result[0] == 1, "Unexpected observable sequence order. Was expecting 1"); Assert.True(result[1] == 2, "Unexpected observable sequence order. Was expecting 2"); }
public static void TestYieldNormalSequence() { var ctSource = new CancellationTokenSource(); var dispatcher = new YieldingDispatcher(ctSource.Token); var sub = new Subject <int>(); var obs = sub.ObserveOn(dispatcher); TestSequenceOrder(dispatcher, sub, obs); ctSource.Cancel(); }