Rubrik: Allgemein | 01.05.05 |
Verwendung von Threads in VB.NET VB-Version: VB5, VB6 | ||
Views: 64.542 |
Es werden immer öfter Fragen zu Threads in VB.NET gestellt. Ralf_oop hat hierzu im Forum diesen interessanten Beitrag mit grundlegenden Information zu Verwendung von Threads erstellt, der nicht verloren gehen sollte:
Als erstes sollte man eine Prozedur haben, die relativ lange braucht, um seine Aufgabe auszuführen (also relativ rechenintensiv). Hier eine sehr sinnvolle Version
Sub Zählen() Dim i As Integer For i = 1 To 10000 Console.WriteLine("Hallo Welt zum {0}-ten Mal", i) Next End Sub
Zweitens muss eine Instanz der Thread-Klasse mit der Prozedur, die ausgeführt werden soll, erstellt werden:
Dim Thread As New Threading.Thread(AddressOf Zählen)
Jetzt kann man den Thread starten:
Thread.Start()
Beendet werden kann der Thread mit Abort(). Dies löst eine ThreadAbortException aus. Damit wird signalisiert, dass der Thread beendet werden soll. Diese Exception kann abgefangen werden, um evtl. abschließende Aufgaben (z.B. eine Datei schließen) noch auszuführen. Hier ein kleines Beispiel:
Shared Sub Zählen() Dim i As Integer Try For i = 1 To 10000 Console.WriteLine("Hallo Welt zum {0}-ten mal.", i) Next Catch ex As ThreadAbortException ' hier Aufräumarbeiten einfügen Return End Try End Sub Shared Sub main() Dim Thread As New Threading.Thread(AddressOf Zählen) Thread.Start() ' irgendwelche Aufgaben, die den Thread beenden wollen Thread.Abort() ' wenn man jetzt den Thread wieder starten möchte, wird eine Exception ausgelöst End Sub
Threads kann man mit Suspend() anhalten. Allerdings wird der Thread nicht sofort angehalten, sondern erst, wenn ein sogenannter sicherer Punkt erreicht ist. Dieser wird vom .NET Framework festgelegt. Um einen Thread wieder auszuführen verwendet man die Resume()-Methode. Mit Sleep() kann der Thread für einen bestimmten Zeitraum (in Millisekunden) angehalten werden.
' Thread für eine Sekunde anhalten Thread.Sleep(1000)
Mit Sleep(0) kann man übrigens ein Umschalten zwischen den Threads erreichen. Falls man auf das Ende eines anderen Threads warten will, kann dies mit der Join-Methode erreicht werden. Denkbar wäre dies, wenn ein Thread Daten liest und der Hauptthread solange wartet, bis alle Daten gelesen worden sind.
Um auf den aktuellen Thread zuzugreifen, gibt es die CurrentThread-Eigenschaft der Thread-Klasse, die ein Thread-Objekt zurückgibt.
Dim Hauptthread As Threading.Thread = Threading.Thread.CurrentThread
Threads haben Eigenschaften, wovon die folgenden am Wichtigsten sind:
IsBackground | Gibt an, ob der Thread ein Hintergrundthread ist. Ein noch laufender Thread verhindert normalerweise, dass ein Programm beendet wird. Ein Hintergrundthread wird beendet, wenn der Prozess, in dem er läuft, beendet wird. | |
Name | Name des Threads | |
Priority | Die Priorität des Threads wird vom Scheduler verwendet um zu entscheiden, wie viel Rechenzeit ein Thread bekommt. Es gibt 5 mögliche Werte: Highest (meiste Rechenzeit), AboveNormal, Normal (Standard), BelowNormal und Lowest (wenigste Rechenzeit). |
|
ThreadState | Gibt den Zustand des Threads an. | |
Folgende Werte existieren: | ||
Unstarted | Thread ist noch nicht gestartet worden | |
Runnig | Thread läuft | |
WaitSleepJoin | Thread schläft oder wartet auf einen anderen Thread | |
Suspended | Thread wurde angehalten | |
Aborted | Thread wurde abgebrochen |
Dies wären die Grundlagen zum Thema Threading.