<PackageReference Include="System.Reactive" Version="4.2.0" />

HistoricalScheduler

Provides a virtual time scheduler that uses DateTimeOffset for absolute time and TimeSpan for relative time.
using System.Collections.Generic; using System.Diagnostics; namespace System.Reactive.Concurrency { [DebuggerDisplay("\\{ Clock = {Clock} Now = {Now.ToString(\"O\")} \\}")] public class HistoricalScheduler : HistoricalSchedulerBase { private readonly SchedulerQueue<DateTimeOffset> _queue = new SchedulerQueue<DateTimeOffset>(); public HistoricalScheduler() { } public HistoricalScheduler(DateTimeOffset initialClock) : base(initialClock) { } public HistoricalScheduler(DateTimeOffset initialClock, IComparer<DateTimeOffset> comparer) : base(initialClock, comparer) { } protected override IScheduledItem<DateTimeOffset> GetNext() { while (_queue.Count > 0) { ScheduledItem<DateTimeOffset> scheduledItem = _queue.Peek(); if (!scheduledItem.IsCanceled) return scheduledItem; _queue.Dequeue(); } return null; } public override IDisposable ScheduleAbsolute<TState>(TState state, DateTimeOffset dueTime, Func<IScheduler, TState, IDisposable> action) { if (action == null) throw new ArgumentNullException("action"); ScheduledItem<DateTimeOffset, TState> si = null; Func<IScheduler, TState, IDisposable> action2 = delegate(IScheduler scheduler, TState state1) { _queue.Remove((ScheduledItem<DateTimeOffset>)si); return action(scheduler, state1); }; si = (ScheduledItem<DateTimeOffset, TState>)new ScheduledItem<DateTimeOffset, TState>((IScheduler)this, state, action2, dueTime, base.Comparer); _queue.Enqueue((ScheduledItem<DateTimeOffset>)si); return si; } } }