Example #1
0
        private void RunTwoScheduleAsync(DateTime start, Func<CalculatedPropertyHelper, Task<int>> calculate1, Func<int> calculate2)
        {
            IScheduler eventLoopScheduler = new EventLoopScheduler();
            Console.WriteLine(this.GetElapsedTimeString(start) + ": Running on thread: " + Thread.CurrentThread.ManagedThreadId);
            IObservable<int> observable1 = Observable.Create<int>(o =>
                {
                    IDisposable d = eventLoopScheduler.ScheduleAsync(async (scheduler, token) =>
                        {
                            await scheduler.Yield();
                            o.OnNext(await calculate1(new CalculatedPropertyHelper(scheduler, token)));
                            o.OnCompleted();
                        });
                    return Disposable.Create(() =>
                        {
                            d.Dispose();
                            Console.WriteLine(this.GetElapsedTimeString(start) + ": Disposed!");
                        });
                });
            IObservable<int> observable2 = Observable.Create<int>(o =>
                {
                    IDisposable d = eventLoopScheduler.ScheduleAsync(async (scheduler, token) =>
                        {
                            o.OnNext(await Task.FromResult(calculate2()));
                            o.OnCompleted();
                        });
                    return Disposable.Create(() =>
                        {
                            d.Dispose();
                            Console.WriteLine(this.GetElapsedTimeString(start) + ": Disposed!");
                        });
                });
            Console.WriteLine(this.GetElapsedTimeString(start) + ": Subscribing.");
            CompositeDisposable s = new CompositeDisposable();
            for (int i = 0; i < 8; i++)
            {
                s.Add(observable1.Subscribe(Console.WriteLine, () => Console.WriteLine(this.GetElapsedTimeString(start) + ": Completed 1.")));
            }

            //for (int i = 0; i < 8; i++)
            //{
            //    s.Add(observable2.Subscribe(Console.WriteLine, () => Console.WriteLine(GetElapsedTimeString(start) + ": Completed 2.")));
            //}
            Console.WriteLine(this.GetElapsedTimeString(start) + ": Subscribed.");
            Thread.Sleep(1700);
            s.Dispose();
            Console.WriteLine(this.GetElapsedTimeString(start) + ": Should have disposed.");
            Thread.Sleep(2000);
            Console.WriteLine(this.GetElapsedTimeString(start) + ": Done.");
        }