ThreadPoolScheduler
Represents an object that schedules units of work on the Windows Runtime thread pool.
            
                using System.ComponentModel;
using System.Runtime.CompilerServices;
using Windows.Foundation;
using Windows.System.Threading;
namespace System.Reactive.Concurrency
{
    [System.Runtime.CompilerServices.NullableContext(1)]
    [System.Runtime.CompilerServices.Nullable(0)]
    [CLSCompliant(false)]
    public sealed class ThreadPoolScheduler : LocalScheduler, ISchedulerPeriodic
    {
        [System.Runtime.CompilerServices.Nullable(0)]
        private sealed class PeriodicallyScheduledWorkItem<[System.Runtime.CompilerServices.Nullable(2)] TState> : IDisposable
        {
            private TState _state;
            private Func<TState, TState> _action;
            private readonly ThreadPoolTimer _timer;
            private readonly AsyncLock _gate = new AsyncLock();
            public unsafe PeriodicallyScheduledWorkItem(TState state, TimeSpan period, Func<TState, TState> action)
            {
                _state = state;
                _action = action;
                _timer = ThreadPoolTimer.CreatePeriodicTimer(new TimerElapsedHandler((object)this, (IntPtr)(void*)), period);
            }
            private void Tick(ThreadPoolTimer timer)
            {
                _gate.Wait<PeriodicallyScheduledWorkItem<TState>>(this, (Action<PeriodicallyScheduledWorkItem<TState>>)delegate(PeriodicallyScheduledWorkItem<TState> this) {
                    this._state = this._action(this._state);
                });
            }
            public void Dispose()
            {
                _timer.Cancel();
                _gate.Dispose();
                _action = Stubs<TState>.I;
            }
        }
        private static readonly Lazy<ThreadPoolScheduler> LazyDefault = new Lazy<ThreadPoolScheduler>(() => new ThreadPoolScheduler());
        [Obsolete("Use the Instance property", false)]
        [EditorBrowsable(EditorBrowsableState.Never)]
        public static ThreadPoolScheduler Default {
            get {
                return LazyDefault.Value;
            }
        }
        public static ThreadPoolScheduler Instance => LazyDefault.Value;
        public WorkItemPriority Priority { get; }
        public WorkItemOptions Options { get; }
        public ThreadPoolScheduler()
        {
        }
        public ThreadPoolScheduler(WorkItemPriority priority)
        {
            Priority = priority;
            Options = 0;
        }
        public ThreadPoolScheduler(WorkItemPriority priority, WorkItemOptions options)
        {
            Priority = priority;
            Options = options;
        }
        public unsafe override IDisposable Schedule<[System.Runtime.CompilerServices.Nullable(2)] TState>(TState state, Func<IScheduler, TState, IDisposable> action)
        {
            if (action == null)
                throw new ArgumentNullException("action");
            UserWorkItem<TState> userWorkItem = (UserWorkItem<TState>)new UserWorkItem<TState>((IScheduler)this, state, action);
            object obj;
            IAsyncAction asyncInfo = ThreadPool.RunAsync(new WorkItemHandler(obj, (IntPtr)(void*)), Priority, Options);
            ((UserWorkItem<TState>)userWorkItem).CancelQueueDisposable = ThreadPoolTimerExtensions.AsDisposable(asyncInfo);
            return userWorkItem;
        }
        public override IDisposable Schedule<[System.Runtime.CompilerServices.Nullable(2)] TState>(TState state, TimeSpan dueTime, Func<IScheduler, TState, IDisposable> action)
        {
            if (action == null)
                throw new ArgumentNullException("action");
            TimeSpan dueTime2 = Scheduler.Normalize(dueTime);
            if (dueTime2.Ticks == 0)
                return Schedule(state, action);
            return ScheduleSlow(state, dueTime2, action);
        }
        private unsafe IDisposable ScheduleSlow<[System.Runtime.CompilerServices.Nullable(2)] TState>(TState state, TimeSpan dueTime, Func<IScheduler, TState, IDisposable> action)
        {
            UserWorkItem<TState> userWorkItem = (UserWorkItem<TState>)new UserWorkItem<TState>((IScheduler)this, state, action);
            object obj;
            ThreadPoolTimer threadPoolTimer = ThreadPoolTimer.CreateTimer(new TimerElapsedHandler(obj, (IntPtr)(void*)), dueTime);
            ((UserWorkItem<TState>)userWorkItem).CancelQueueDisposable = threadPoolTimer.AsDisposable();
            return userWorkItem;
        }
        public IDisposable SchedulePeriodic<[System.Runtime.CompilerServices.Nullable(2)] TState>(TState state, TimeSpan period, Func<TState, TState> action)
        {
            if (period < TimeSpan.FromMilliseconds(1))
                throw new ArgumentOutOfRangeException("period", Strings_PlatformServices.WINRT_NO_SUB1MS_TIMERS);
            if (action == null)
                throw new ArgumentNullException("action");
            return new PeriodicallyScheduledWorkItem<TState>(state, period, action);
        }
    }
}