Disposing System.Threading.Timer

I guess there are many ways to dispose this a timer, I was looking for an efficient way of doing it and making sure that after the Dispose method was called I had no outstanding timer notifications.

In Win32 there is the concept of timer-queue timers, and in that APi set, when a timer is deleted by using DeleteTimerQueueTimer API, if INVALID_HANDLE_VALUE is passed to the CompletionEvent, the API automatically wait for any pending notification.

So, applying the same concept, I pass an “invalid” wait handle to Timer.Dispose and it works. Here is the invalid wait handle class:

internal sealed class InvalidWaitHandle : WaitHandle
    private readonly static InvalidWaitHandle instance = new InvalidWaitHandle();

    private InvalidWaitHandle() {}

    public static WaitHandle Instance {
        get {
            return instance;

    public override IntPtr Handle {
        get {
            return WaitHandle.InvalidHandle;
        set {
            throw new InvalidOperationException();

And for disposing the Timer, just write:


Comments (1)

  1. peterfrank123456 says:

    Wouldn't that be the same as calling System.Threading.Timer.Dispose()?

    If you don't use the wait handle, why create one?

    System.Threading.Timer.Dispose(WaitHandle) isn't blocking afaik, nor is System.Threading.Timer.Dispose().

    I think to make sure no callbacks are queued up you create a proper WaitHandle object and wait for it to signal after calling System.Threading.Timer.Dispose(WaitHandle).

    Correct me if I'm wrong.

Skip to main content