Da System.Timers.Timer und System.Windows.Forms.Timer beide das ThreadPool verwenden, hat es kein Handle zu einem Betriebssystem-Timer, so dass keine native Timer-Ressource entsorgt wird - nur ein abgeschlossener Thread . Ich bin mir nicht sicher, ob Sie einen Thread erfassen können, der vom ThreadPool recycelt wird, aber ich könnte mich irren.
Sie könnten vielleicht Ihre eigene Rolle (ich habe nicht getestet, und einen Manual in Entsorgen nehmen könnte nützlicher sein):
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();
}
}
Ich denke, das Ereignis System.Timers.Timer Disposed wird ausgelöst, sobald es die System.Threading.Timer Dispose-Methode aufgerufen hat. –
@Ian Das Ereignis wird in 'Component.Dispose (disposing)' aufgerufen, so dass Sie das WaitHandle vor dem Aufruf von base.Dispose() signalisieren und das benutzerdefinierte Dispose (WaitHandle) verwenden, nach dem es ausgelöst werden soll. –