private static void ContrlingOrderOfAsyncCode() { Demo.DisplayHeader("Contrling the order of async code with Concat"); var resetEvent = new AutoResetEvent(false); Console.WriteLine("Using SelectMany wont maintain items order"); var svc = new VariableTimePrimeCheckService(numberToDelay: 3); IObservable<int> primes = from number in Observable.Range(1, 10) from isPrime in svc.IsPrimeAsync(number) where isPrime select number; primes .DoLast(() => resetEvent.Set(), delay: TimeSpan.FromSeconds(1)) .SubscribeConsole("primes - unorderd"); // Waiting for the previous example to finish resetEvent.WaitOne(); Console.WriteLine("Using concat does enforce order"); primes = Observable.Range(1, 10) .Select(async (number) => new { number, IsPrime = await svc.IsPrimeAsync(number) }) .Concat() .Where(x => x.IsPrime) .Select(x => x.number); primes.SubscribeConsole("primes"); // Waiting for the previous example to finish resetEvent.WaitOne(); }