private static void QueueTimerCompletion(TimerQueueTimer timer)
{
- WaitCallback callback = s_fireQueuedTimerCompletion;
- if (callback == null)
- s_fireQueuedTimerCompletion = callback = new WaitCallback(FireQueuedTimerCompletion);
-
- // Can use "unsafe" variant because we take care of capturing and restoring
- // the ExecutionContext.
- ThreadPool.UnsafeQueueUserWorkItem(callback, timer);
- }
-
- private static WaitCallback s_fireQueuedTimerCompletion;
-
- private static void FireQueuedTimerCompletion(object state)
- {
- ((TimerQueueTimer)state).Fire();
+ // Can use "unsafe" variant because we take care of capturing and restoring the ExecutionContext.
+ ThreadPool.UnsafeQueueCustomWorkItem(timer, forceGlobal: true);
}
#endregion
//
// A timer in our TimerQueue.
//
- internal sealed class TimerQueueTimer
+ internal sealed class TimerQueueTimer : IThreadPoolWorkItem
{
//
// The associated timer queue.
SignalNoCallbacksRunning();
}
+ void IThreadPoolWorkItem.ExecuteWorkItem() => Fire();
+
+ void IThreadPoolWorkItem.MarkAborted(ThreadAbortException tae) { }
+
internal void SignalNoCallbacksRunning()
{
Win32Native.SetEvent(m_notifyWhenNoCallbacksRunning.SafeWaitHandle);