protected LocalScheduler() { timer_clock_monitor = new PeriodicTimerSystemClockMonitor(TimeSpan.FromSeconds(10)); timer_clock_monitor.SystemClockChanged += (o, e) => { var future = new List <ScheduledItemImpl <DateTimeOffset> > (); foreach (var task in tasks) { task.Cancel(); future.Add(task.Reschedule(task.DueTime + (e.NewTime - e.OldTime))); } tasks.AddRange(future); }; }
private static void PeriodicSystemClockChangeMonitor_Callback() { var provider = new FakeClockPlatformEnlightenmentProvider(); PlatformEnlightenmentProvider.Current = provider; var clock = (FakeClock)provider.GetService <ISystemClock>(); clock._now = new DateTimeOffset(2012, 4, 26, 12, 0, 0, TimeSpan.Zero); var cal = (FakeClockCAL)provider.GetService <IConcurrencyAbstractionLayer>(); var period = TimeSpan.FromSeconds(1); var ptscm = new PeriodicTimerSystemClockMonitor(period); var delta = TimeSpan.Zero; var n = 0; var h = new EventHandler <SystemClockChangedEventArgs>((o, e) => { delta = e.NewTime - e.OldTime; n++; }); ptscm.SystemClockChanged += h; Assert.NotNull(cal._action); Assert.True(cal._period == period); Assert.Equal(0, n); clock._now += period; cal._action(); Assert.Equal(0, n); clock._now += period; cal._action(); Assert.Equal(0, n); var diff1 = TimeSpan.FromSeconds(3); clock._now += period + diff1; cal._action(); Assert.Equal(1, n); Assert.True(delta == diff1); clock._now += period; cal._action(); Assert.Equal(1, n); clock._now += period; cal._action(); Assert.Equal(1, n); var diff2 = TimeSpan.FromSeconds(-5); clock._now += period + diff2; cal._action(); Assert.Equal(2, n); Assert.True(delta == diff2); clock._now += period; cal._action(); Assert.Equal(2, n); ptscm.SystemClockChanged -= h; Assert.Null(cal._action); }