Wenn Sie einen "rohen" .net-Timer absetzen, können Sie einen Wait-Handle übergeben, der aufgerufen wird, sobald der Win32-Timer zerstört wurde, und Sie können davon ausgehen, dass Ihr Rückruf nicht aufgerufen wird. (Und der Timer wird vom GC als "tot" betrachtet)
Wie mache ich das mit einem System.Timers.Timer?
Da sowohl System.Timers.Timer als auch System.Windows.Forms.Timer den ThreadPool verwenden, verfügt er nicht über einen Handle für einen Betriebssystemtimer, sodass keine native Timerressource entsorgt wird - nur ein abgeschlossener Thread. Ich bin mir nicht sicher, ob Sie einen Thread erfassen können, der vom ThreadPool wiederverwendet wird, aber ich könnte falsch liegen.
Sie könnten vielleicht selbst rollen (ich habe das nicht getestet, und es wäre sinnvoller, ein ManualResetEvent in Dispose zu verwenden):
%Vor%Setzen Sie ein Flag, bevor Sie dispose aufrufen, und aktivieren Sie dieses Flag in Ihrem abgelaufenen Handler. Selbst wenn der Timer ausgelöst wird, verhindert das Flag, dass ein zugehöriger Handler-Code ausgeführt wird. Sie könnten dieses Muster formalisieren, indem Sie einen Wrapper für den Timer schreiben.
Stellen Sie sicher, dass Ihre Flagge als flüchtig gekennzeichnet ist, da auf sie von verschiedenen Threads aus zugegriffen wird.
Tags und Links .net multithreading timer dispose