public AppModel() { _CurrentInfection = InitializeInfection(InitialSettings.ToValue()); InfectionSnapshot.Value = _CurrentInfection; CreateObserver(InitialSettings) .Throttle(TimeSpan.FromSeconds(0.1)) .Subscribe(_ => { _CurrentInfection = InitializeInfection(InitialSettings.ToValue()); InfectionSnapshot.Value = _CurrentInfection; }); IsRunning .Where(b => b) .ObserveOn(TaskPoolScheduler.Default) .Subscribe(_ => Simulate()); }
void Simulate() { var subscription = Observable.Interval(SnapshotInterval) .Subscribe(_ => InfectionSnapshot.Value = _CurrentInfection); if (_CurrentInfection.Turn > 0) { _CurrentInfection = InitializeInfection(InitialSettings.ToValue()); } while (IsRunning.Value) { var rs = RealtimeSettings.ToValue(); Thread.Sleep(TimeSpan.FromSeconds(rs.ExecutionInterval)); _CurrentInfection = NextInfection(_CurrentInfection, rs); } subscription.Dispose(); }