VB.NET Timer Beispiel – Code im Intervall ausführen (2026)
Der VB.NET Timer ist das einfachste Werkzeug, um Code in einem festen Intervall auszuführen. In diesem Beitrag zeige ich dir Schritt für Schritt, wie du den System.Windows.Forms.Timer richtig einsetzt, typische Fehler wie Timer-Overlap vermeidest und wann der moderne PeriodicTimer (.NET 6+) die bessere Wahl ist.
Inhaltsverzeichnis
Wofür braucht man einen Timer?
Vor allem bei Anfängern ist der Timer ein beliebtes Steuerelement, da er sich einfach auf die Form ziehen und mit Code versehen lässt. Es gibt allerdings auch beim Timer einige Sachen zu beachten, sonst stehen Kopfschmerzen bevor.
Wer sich bereits mit dem Timer auskennt, aber den VB.NET Timer zur Laufzeit erstellen möchte, findet im verlinkten Beitrag eine Anleitung. Für einen VB.NET Timer Countdown gibt es ebenfalls einen eigenen Artikel.
Der Zweck des Timers
Die Frage, die man sich vermutlich zuerst stellt, ist, welchen Sinn ein Timer überhaupt hat und warum man ein Control dafür braucht?
Code im Intervall ausführen

Jeder kommt in seinem Programmierer-Dasein glaube ich an den Punkt, dass er Code Intervall-basiert ausführen möchte. Das heißt also, dass ein gewisser Code-Block immer wieder, aber mit gewissen Pausen dazwischen ausgeführt werden soll. Anders gesagt: Ich möchte meinen Code timen – höhö 😉 und suche nach der passenden Möglichkeit!
Die erste Anlaufstelle, die man finden wird, ist der Timer aus dem „System.Windows.Forms“-Namespace. Das ist auch der Timer, der sich standardmäßig in der Steuerelemente-Toolbox befindet und daher vermutlich der Ausgangspunkt.
Code nach einer gewissen Zeit ausführen

Eine andere Funktionsweise, Welche häufig analog zum Timer ergoogelt wird, ist die Ausführung von Code nach einer gewissen Zeit. Man könnte zum Beispiel nach dem Start des Programmes wollen, dass es 5 Sekunden danach einen Ping an einen Server sendet. Oder man möchte vielleicht mit gewissem Zeit-Verzug die aktuelle Versionsnummer der Applikation ziehen.
Sicherlich gibt es heutzutage – mit dem modernen NET Framework – „bessere“ Alternativen als einen Timer, jedoch.. Neulinge stoßen auch heute noch immer wieder auf Diese, oder ähnliche Problemstellungen und somit auf den Timer. So ging es mir in meiner Anfangszeit natürlich auch..
Die 6 verschiedenen Timer in .NET
Wenn man nun durch Recherche die ersten paar Forenbeiträge gefunden hat, werden einem mehr oder weniger hier und da auch anderen Klassen auffallen. Wer tiefer forscht wird – jedenfalls mir bekannt – mittlerweile 6 Timer in .NET finden. Mit .NET 6 kam der neue PeriodicTimer hinzu, der speziell für asynchrone Hintergrundaufgaben konzipiert wurde.
Ja richtig gehört, es sind ganze sechs, uff!
Die verschiedenen Timer
Der Vollständigkeit halber, liste ich Diese hier gerne alle auf:
System.Windows.Forms.TimerSystem.Timers.TimerSystem.Threading.Timer- System.Threading.PeriodicTimer ← neu (.NET 6+)
System.Web.UI.TimerSystem.Windows.Threading.DispatcherTimer
Letztendlich geht es in diesem Beitrag allerdings primär um den folgenden, „normalen“ Timer. Lass Dich also bitte vor allem als Anfänger nicht von den anderen möglichen Timern einschüchtern, bzw. verwirren!
System.Windows.Forms.Timer
Das Timer-Steuerelement im Detail
Schauen wir uns nun nach dem Intro-Gerede 😉 das Timer-Control mal genauer an.
Konstruktoren
Das Timer-Steuerelement hat 2 verschiedene Konstruktoren:
new()
Einmal den leeren Konstruktor, dementsprechend ohne Parameter.
new(container)
Und als nächstes den Konstruktor mit einem Parameter namens Container. Um die ganze Sache nicht unnötig zu verkomplizieren, ist diese Überladung des Konstruktors einfach nur dazu da, den Timer mit einem Container zu assoziieren. Dies geschieht zum Beispiel im Hintergrund, wenn der Timer aus der Toolbox auf die Form gezogen wird. Dazu kann man sich auch gut den Designer-Code der Form einmal anschauen, aber Vorsicht, nichts kaputtmachen!
Me.Timer1 = New System.Windows.Forms.Timer(Me.components)
Eigenschaften / Properties
Folgende Eigenschaften hat der Timer zu bieten
Name
Das ist natürlich eine mehr oder weniger Standard-Eigenschaft. Mit diesem Namen spricht man den Timer nachher im Code an.
Enabled
Dieser Wert gibt an, ob der Timer gerade „läuft“, also ob er gerade sein Tick-Ereignis im angegebenen Intervall signalisieren und wiederholen soll. Hat praktisch den gleichen Effekt wie die nachfolgenden Methoden.
Interval
Mit der Interval-Property legen wir fest, bzw. rufen wir ab, in welcher Frequenz der Timer tickt, also seinen Code abarbeitet. Standardmäßig steht der Wert auf 100 Millisekunden. Einen Tipp den ich mal vor ewigen Zeiten gelesen habe ist, das Intervall des Timers nicht unter 18ms zu stellen, da das menschliche Auge wohl eh nichts darunter wahrnehmen kann – ob’s stimmt, keine Ahnung 😊. Jedenfalls wenn wir irgendwas visuell „Timern“ wollen.
Tag
Diese Eigenschaft bietet die Möglichkeit benutzerdefinierte Daten an das Objekt zu knüpfen. So viel jedenfalls zur komplizierten Beschreibung aus Visual Studio. Einfach gesagt: Du kannst eine eigene Klasse erstellen, instanziieren und dem Tag des Controls zuweisen. So kannst du dann später wieder auf die Daten zugreifen, indem du diese natürlich wieder in den richtigen Typ castest und mit dem Getter aus der Eigenschaft herausholst.
Methoden
Hier gehe ich auf die wichtigen, jedoch nicht auf alle Methoden des Timers ein.
Start
Startet den Timer und hat praktisch den selben Effekt, wie die Enabled-Eigenschaft auf True zu setzen.
Stop
Stoppt den Timer und hat praktisch den selben Effekt, wie die Enabled-Eigenschaft auf False zu setzen.
Ereignisse
Tick
„Tick“ ist das wichtigste Ereignis des Timers, also wo eigentlich alles seinen Lauf nimmt. Dieses Ereignis wird im angegebenen Intervall aufgerufen und bietet uns so die Möglichkeit, Code wiederholend aufzurufen – auf dem UI-Thread.
Praxisbeispiel: Digitale Uhr bauen
Nachdem du die wichtigsten Eigenschaften und Methoden des Timers kennst, setzen wir das Gelernte in die Praxis um.
Fallbeispiel – Digitale Uhr
In unserem VB.NET Timer Beispiel werden wir es mal versuchen, eine kleine digitale Uhr darzustellen. Der erste Gedanke ist ggf. Folgender: „Okay, ich muss also jede Sekunde, die aktuelle Uhrzeit anzeigen“. Schauen wir uns das Ganze mal an:
Timer auf die Form ziehen
Um mit dem VB.NET Timer Beispiel zu beginnen, musst du ein Timer-Steuerelement auf die Form ziehen. Wundere dich jedoch nicht, dass das Control im Gegensatz zu einem Button z. B. nicht direkt auf der Form auftaucht.
Stattdessen positioniert sich der Timer unterhalb der Form und in einem gesonderten Bereich:

Wann geht es los?
Zuerst müssen wir uns Gedanken machen, wann der Timer immer zuschlagen, also den Code ausführen soll. In unserem Beispiel könnten wir daher sagen: Jede Sekunde, richtig? Nope, leider nicht! Wieso nicht? Ich versuche es mit meinen außerordentlichen Paint Skills – löl – zu verdeutlichen:
Wir erinnern uns ans gute Versteckspielen aus der Kindheit! Derjenige der zählt, hat das ungefähr so gemacht

Er hat bei 1 begonnen (der erste Tick), dann hat er 1 Sekunde gewartet und bei 2 weiter gemacht, wieder eine Sekunde gewartet, 3, usw.. Nunja, aber nur weil unser Zähler in diesem Rhythmus begonnen hat zu zählen, heißt das jedoch nicht, dass es synchron mit der tatsächlichen Zeit ist. Dabei spielt neben dem eigenen Rhythmus natürlich auch der Start-Zeitpunkt eine wesentliche Rolle.
Wenn unsere Computer-Uhr zum Beispiel einen Sekunden-Sprung macht, heißt das nicht, dass auch wir diesen Sprung beim Zählen in diesem Moment machen. Das kann daran liegen, dass wir eventuell erst wenige Millisekunden vorher begonnen haben zu zählen.

Nachdem der Timer nun schon „auf der Form“ ist und wir einen möglichen Fallstrick verstanden haben, können wir anfangen zu coden. Das Intervall des Timers sollte für die Uhr also auf dem Standardwert von 100ms ausreichen.
Das Tick-Ereignis mit Code versehen
Fügen wir nun den Code hinzu, der die Uhrzeit z. B. in einem Label anzeigt, daher das Label zur Form hinzuzufügen nicht vergessen! Ich habe den Timer1 noch in etwas Passenderes, also z. B. tmrTime unbenannt und das Label passend lblTime genannt.
Private Sub tmrTime_Tick(sender As Object, e As EventArgs) Handles tmrTime.Tick
lblTime.Text = DateTime.Now.ToString("HH:mm:ss")
End Sub
Let’s Debug – VB.NET Timer Beispiel
Starte das Programm nun mit F5, bzw. mit dem Play-Knopf, oben in der Mitte in Visual Studio. Und? Was passiert!? Nichts, haha 😂. Vergiss nicht, den Timer in z. B. dem „Form-Load“-Ereignis (z. B. Doppelklick auf die Form selbst) durch tmrTime.Start() zu starten. Alternativ kannst du den Timer natürlich auch standardmäßig laufen lassen, indem du im Designer die Timer-Eigenschaft „Enabled“ auf True setzt.
Fertig – So sieht die digitale Uhr z. B. aus
Hier ein animiertes Bild von meiner digitalen Timer Uhr:

Tickst du noch ganz richtig?

Ich kann mich noch zu gut an ein bestimmtes Problem erinnern, Welches ich als Anfänger hatte. Zeit floß in die Recherche und der Code wurde mehrfach überprüft, bis ich dann endlich fündig wurde.. Ich hatte eine Synchronisation eines Terminkalenders gebaut und stieß dort auf das Problem.
Timer Arbeitsaufgabe Beispiel
Die Aufgabe – Terminkalender Synchronisation
Tja da stand ich damals bei meiner ersten Anstellung und sollte die Aufgabe erledigen, die Termine eines Kalenders zu synchronisieren. Den Kalender an sich hatte ich schon – relativ mühelos – gebaut, nachfolgend ging es also nur noch um die Auflistung der Termine darin. Auch dies stellte rein vom Code her kein Problem für mich dar, bis..
Die Synchronisations-Schleife
Da natürlich – wie immer – alles schnell gehen musste, nahm ich *zack* einen Timer zur Hand, zog ihn auf die jeweilige Form und fing an im Tick-Ereignishandler in die Tastatur zu hacken. Ein paar Datenbank-Abfragen hier, ein paar Gruppierungen da, zum Schluss noch ein paar Schleifen und das Ding stand. Nur ein komischer Bug war da..
Der Timer „überlappte“
Das war nachher der Ursprung des Fehlers. Die Verarbeitung der Daten dauerte länger, als das Intervall des Timers dieser Verarbeitung bis zur nächsten Ausführung Zeit gab – verdammt!
Lösung A:
Den Timer so lange pausieren, wie der Tick-Handler zum Abarbeiten der Daten benötigt.
Lösung B:
Den Intervall des Timers hochdrehen.
Lösung C:
Ein anderes Werkzeug wie z. B. Async/Await verwenden.
Meine (damalige) Entscheidung
Aufgrund der Schnelligkeit (da ich es auswendig wusste), habe ich zur Async/Await-Variante gewechselt. Ich habe den Timer also durch eine Async Sub (geht bei EventHandlern leider nicht anders) ersetzt, welche Ihre Arbeit dann durch eine Schleife im inneren, im Intervall ausführte.
Die schlechteste Variante
Die schlechteste Option wäre vermutlich Lösung B, denn sobald die Arbeitslast durch mehr Daten wächst, könnte man eventuell wieder vor dem gleichen Problem stehen.
Die optimale Entscheidung
Die damals optimalste Lösung wäre vermutlich die Option A gewesen. Dadurch hätte man lediglich wenige Zeilen ergänzen müssen: Shame on me!
Private Sub TheTimer_Tick(sender As Object, e As EventArgs) Handles TheTimer.Tick
' use this, or talk to the timer directly..
Dim timer = CType(sender, Timer)
' stop the timer directly
TheTimer.Stop();
' Data operations..
' start the timer again..
TheTimer.Start()
End Sub
Für komplexere Hintergrundarbeit ist der VB.NET BackgroundWorker eine bewährte Alternative. Achte dabei auf die Regeln für threadübergreifende Zugriffe, sobald du UI-Elemente aus einem anderen Thread ansprechen willst.
Fallbeispiel – Code nach Zeit ausführen
Im nächsten kleinen Timer-Abschnitt beschäftigen wir uns noch ein wenig mit einem weiteren Fallbeispiel. Einige Zeit nach dem ursprünglichen Erscheinen des Beitrages ist mir aufgefallen, dass ich noch ein wichtiges Anwendungsbeispiel vergessen habe. Dabei geht es um die einmalige Ausführung eines Code-Block nach einer gewissen Verzögerung, wie z. B. „mache xy nach 5 Sekunden“.
Ziehe dafür einfach einen Timer auf die Form und packe folgenden Code (z. B. durch Doppelklick auf den Timer) in den Ereignishandler des Tick-Ereignisses:
Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick ' the code to be executed on each tick End Sub
private void Timer1_Tick(object sender, EventArgs e)
{
// the code to be executed on each tick
}
Beachte dabei, dass Du – falls Du C# verwenden solltest – auch auf die Verknüpfung des Handlers zum Ereignis achten musst. In VB.NET passiert dies oben durch die „Handles-Klausel“, oder durch eine getrennte Anweisung mit Hilfe von „AddHandler„.
In C# ist dies hingegen eine getrennte Anweisung im Designer-Code:
// somewhere in the designer code Timer1.Tick += Timer1_Tick;
Falls Du den Handler durch den Doppelklick auf den Timer erstellt hast, solltest Du Dir im ersten Schritt über Obiges keine Sorgen machen müssen. Visual Studio erstellt die jeweiligen Methoden und die Verknüpfungen zwischen Ereignis und Methode automatisch. Im nächsten Schritt kannst Du die „Enabled“-Eigenschaft des Timers nun im Designer auf „True“ stellen.
Das würde den Timer direkt beim Starten der Form (falls gewünscht) automatisch ausführen. Ansonsten kannst Du den Timer natürlich auch durch die entsprechende Methode namens „Start“, zu jeder Zeit manuell starten. Achte dabei auf ein passendes Intervall, wie z. B. „5000“ (in Millisekunden) für 5 Sekunden.
Damit der Code letztendlich nur einmal ausgeführt wird, stoppen wir den Timer sofort beim ersten (und dadurch einzigen) Aufruf des Tick-Ereignishandlers.
Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick Timer1.Stop() ' do your thing End Sub
private void Timer1_Tick(object sender, EventArgs e)
{
Timer1.Stop();
// do your thing
}
Anschließend kannst Du dann den eigentlichen Code ausführen lassen und falls Du möchtest, den Timer auch später erneut aufrufen. Schaue Dir allerdings unbedingt final an, wie man es mit modernen Framework-Mitteln stattdessen umsetzen könnte. Zum Thema asynchrone Programmierung habe ich im entsprechenden Beitrag geschrieben.
Moderne Alternative: PeriodicTimer (.NET 6+)
Seit .NET 6 gibt es den System.Threading.PeriodicTimer — eine moderne, asynchrone Alternative um klassischen Timer-Steuerelement. Er eignet sich besonders für Hintergrundaufgaben ohne UI-Bezug:
Private Async Function StartPeriodicWorkAsync() As Task
Using timer As New PeriodicTimer(TimeSpan.FromSeconds(5))
While Await timer.WaitForNextTickAsync()
' Dein Code hier — wird alle 5 Sekunden ausgeführt
End While
End Using
End Function
Der große Vorteil: Das Overlap-Problem aus dem obigen Beispiel existiert hier nicht, der nächste Tick wird erst ausgelöst, wenn der vorherige abgearbeitet ist. Für neue Projekte ist der PeriodicTimer daher oft die bessere Wahl.
FAQ
Für WinForms-Anwendungen mit UI-Bezug nutze System.Windows.Forms.Timer. Für Hintergrundaufgaben ohne UI eignet sich System.Timers.Timer oder ab .NET 6 der neue PeriodicTimer.
Der System.Windows.Forms.Timer läuft auf dem UI-Thread. Wenn Dein Tick-Code zu lange dauert (z.B. Datenbankabfragen), blockiert er die Oberfläche. Lösung: Stoppe den Timer vor der Verarbeitung und starte ihn danach neu, oder nutze Async/Await.
Das Intervall wird in Millisekunden angegeben. Für 1 Sekunde setze Timer1.Interval = 1000, für 5 Sekunden Timer1.Interval = 5000.
Der System.Windows.Forms.Timer läuft auf dem UI-Thread und eignet sich für Oberflächenaktualisierungen. Der System.Timers.Timer arbeitet auf einem Threadpool-Thread und ist besser für Hintergrundaufgaben, erfordert aber Invoke für UI-Zugriffe.
Setze das Timer-Intervall auf die gewünschte Verzögerung (z.B. 5000 für 5 Sekunden) und rufe im Tick-Handler als Erstes Timer1.Stop() auf. So wird der Code nur einmal ausgeführt. Alternativ nutze Await Task.Delay() für eine modernere Lösung.
Fazit
Der System.Windows.Forms.Timer ist der schnellste Weg, um Code in einem festen Intervall auszuführen. Achte darauf, den Timer bei längerer Verarbeitung zu stoppen und danach neu zu starten, um Overlap-Probleme zu vermeiden. Für neue Projekte ohne UI-Bezug lohnt sich ein Blick auf den PeriodicTimer ab .NET 6.