vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#

https://www.vbarchiv.net
Rubrik: Allgemein01.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.

 
 
Copyright ©2000-2024 vb@rchiv Dieter OtterAlle Rechte vorbehalten.


Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.