Поскольку System.Timers.Timer и System.Windows.Forms.Timer оба используют ThreadPool, он не имеет дескриптора таймера операционной системы, поэтому нет собственного ресурса таймера, который удаляется - просто завершенный поток. Я не уверен, что вы можете перехватить поток, перерабатываемый ThreadPool, но я могу ошибаться.
Возможно, вы можете свернуть свои собственные (я не проверял это, и использование ManualResetEvent в Dispose может быть более полезным):
void Run()
{
ManualResetEvent resetEvent = new ManualResetEvent(false);
System.Threading.Timer timer = new System.Threading.Timer(delegate { Console.WriteLine("Tick"); });
timer.Dispose(resetEvent);
MyTimer t = new MyTimer();
t.Interval = 1000;
t.Elapsed += delegate { t.Dispose(resetEvent); };
resetEvent.WaitOne();
}
public class MyTimer : System.Timers.Timer
{
protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
}
public virtual void Dispose(WaitHandle handle)
{
handle.SafeWaitHandle.Close();
Dispose();
}
}