I have a Windows Service implemented in C# that needs to do some work every so often. I\'ve implemented this using a System.Threading.Timer with a callback method t
Possible solution for protecting the callback method from working on a disposed timer:
https://stackoverflow.com/a/15902261/193178
As described in "Concurrent Programming on Windows":
Create a dummy class InvalidWaitHandle, inheriting from WaitHandle:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Threading;
namespace MyNameSpace
{
class InvalidWaitHandle : WaitHandle
{
}
}
Hence you can Dispose a System.Threading.Timer properly like this:
public static void DisposeTimer()
{
MyTimer.Dispose(new InvalidWaitHandle());
MyTimer = null;
}
With this code
timer = new Timer( state => {
// simulate some work that takes ten seconds
Thread.Sleep( tickInterval * 10 );
// when the work is done, schedule the next callback in one second
timer.Change( tickInterval, Timeout.Infinite );
},
null,
tickInterval, // first callback in one second
Timeout.Infinite );
it is almost certain that you will Dispose the timer while it is sleeping.
You will have to safeguard the code after Sleep() to detect a Disposed timer. Since there is no IsDisposed property a quick and dirty static bool stopping = false; might do the trick.
You do not need to dispose of the timer to stop it. You can call Timer.Stop() or set Timer.Enabled to false, either of which will stop the timer from running.