Sicheres Beenden von Timer-Instanzen

Die Klasse System.Threading.Timer verfügt über eine parameterlose Dispose-Funktion zur Freigabe. Laut Dokumentation sind jedoch Timer-Ereignisse nach der Freigabe möglich. Deshalb sollte die parameterlose Variante der Dispose-Funktion besser nicht benutzt werden.

Die alternative Dispose-Funktion erwartet ein Ereignis (WaitHandle), das signalisiert wird, sobald die Freigabe abgeschlossen ist. So kann nach dem Aufruf dieser Dispose-Funktion auf das Ereignis gewartet werden. Auf den ersten Blick scheint dies eine gute Lösung zu sein.

Durch Tests kann jedoch nachgewiesen werden, dass es im Zusammenhang mit der Change-Funktion offensichtlich ein weiteres nicht wirklich dokumentiertes Problem gibt. So können unerwartete Timer-Ereignisse nach Signalisierung des Abschlusses der Freigabe beobachtet werden.

Dieser Effekt ist logisch und zu erwarten, da Timer-Ereignisse unabhängig von vorherigen Timer-Ereignissen auftreten können. Wenn eine Timer-Funktion sekündlich aufgerufen werden soll, so wird diese auch dann aufgerufen, wenn der vorherige Aufruf noch nicht abgeschlossen ist. Derartige Programme sind jedoch schwer zu kontrollieren und zu synchronisieren und sollten deshalb vermieden werden.

Wenn feststeht, dass Folgeaufrufe der Timer-Funktion erst dann erfolgen sollen, wenn der jeweils vorherige Aufruf vollständig abgeschlossen ist, muss folgendes beachtet werden:

  • keine periodische Aufrufe anfordern (period-Parameter ist immer Timeout.Infinite)
  • Change, Dispose und die Timer-Funktion selbst synchronisieren (z.B. mit lock)
  • Aufrufe der Timer-Funktion nach Freigabe ignorieren

Ähnliche Artikel

Schreiben Sie einen Kommentar