Frage zu System.Threading.Timer

23/09/2009 - 14:48 von ChristianH | Report spam
Hi,

ich verwende wie nachstehend einen Timer:

m_myTimer = new Timer(TimerProc, null, RetryInXXMinutes, RetryInXXMinutes);

In der TimerProc zerstöre ich den Timer wie folgt:
if (null == m_myTimer ) { return; }
m_myTimer .Dispose();
m_myTimer = null;

Angeblich soll es vorkommen, dass die TimerProc aufgerufen wird, obwohl der
Timer beendet wurde. Kann es sein, dass das Timer-Objekt, obwohl Dispose()
aufgerufen und dem Member null zugewiesen wurde, der Timer noch kurze Zeit
lebt (bis der Garbage Collector diesen endgültig zerstört) und die TimerProc
nochmals aufruft?

Danke
Christian
 

Lesen sie die antworten

#1 Frank Dzaebel
23/09/2009 - 20:29 | Warnen spam
Hallo Christian,

Angeblich soll es vorkommen, dass die TimerProc aufgerufen wird,
obwohl der Timer beendet wurde. Kann es sein, dass das Timer-Objekt,
obwohl Dispose() aufgerufen und dem Member null zugewiesen wurde, der
Timer noch kurze Zeit lebt (bis der Garbage Collector diesen
endgültig zerstört) und die TimerProc nochmals aufruft?



Das ist richtig. In diesen Fàllen wird gern das Dispose mit der
Methodenüberladung WaitHandle empfohlen:

[Timer.Dispose-Methode (WaitHandle) (System.Threading)]
http://msdn.microsoft.com/de-de/lib...tkt95.aspx

[Timer-Klasse (System.Threading)]
http://msdn.microsoft.com/de-de/lib...timer.aspx

Theoretisch ginge z.B. auch eine "volatile bool" - Synchronisation,
die also am Anfang abgefragt würde.

Ansich wird der "Threading.Timer" ja nicht für die Verwendung
mit Windows Forms empfohlen, da die Rückrufe nicht im Thread
der Benutzeroberflàche auftreten. Deswegen sind z.T. solche
eigenen Synchronisations-Verfahren notwendig. So aber durchaus
machbar.


ciao Frank
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET

Ähnliche fragen