Freies Threading mit Visual Basic .NET

Veröffentlicht: 04. Sep 2003 | Aktualisiert: 27. Jun 2004

Von Mathias Schiffer

VB-Anwender waren bisher nicht verwöhnt, was das quasiparallele Ausführen von Threads angeht. Mit Visual Basic .NET wird nicht nur alles besser, sondern auch einfacher.

Unter Visual Basic 6.0 bedurfte es einiger, mitunter schmerzhafter Umwege, um die Ausführung mehrere Threads erreichen zu können.

Mit Visual Basic .NET lassen Sie diese Schmerzen hinter sich: Der AddressOf-Operator und vor allem der Namespace System.Threading machen die Ausführung mehrerer Threads zum reinsten Kinderspiel!

Erzeugen Sie einfach ein neues Thread-Objekt, dem Sie als Konstruktor mithilfe von AddressOf die Adresse einer Threadmethode übergeben. Diese Threadmethode ist absolut nichts besonderes oder kompliziertes - sie ist schlicht diejenige (parameterlose) Methode, die bei Start des Threads ausgeführt werden soll. Den Thread starten Sie dann mit der Start-Methode des erzeugten Thread-Objekts.

Ein einfaches Konsolen-Beispielprogramm zeigt, wie neben dem "Hauptprogramm" zusätzlich zwei Threads quasiparallel ablaufen. Alle drei Anwendungsteile geben abwechselnd ihre Ausgaben in ein Konsolenfenster aus:

Imports System.Threading 
' ... 
Class FreeThreading 
  Shared Sub Main() 
 Try 
   ' Einen Thread fuer Shared Sub Thread1 anlegen 
   Dim T1 As New Thread(AddressOf Thread1) 
   ' Die Thread-Priorität festlegen 
   T1.Priority = ThreadPriority.Normal 
   ' Den Thread starten 
   T1.Start() 
   ' Einen Thread fuer Shared Sub Thread2 anlegen 
   Dim T2 As New Thread(AddressOf Thread2) 
   ' Die Thread-Priorität festlegen 
   T2.Priority = ThreadPriority.Normal 
   ' Den Thread starten 
   T2.Start() 
   ' Neben den beiden gestarteten Threads zur Demonstration 
   ' auch an dieser Stelle weiter nebenläufigen Code aus- 
   ' führen: 
   Do 
  Console.WriteLine("Hier ist das 'Hauptprogramm'.") 
  Thread.Sleep(500) 
   Loop 
 ' Fehler abfangen und ausgeben 
 Catch e As Exception 
   MsgBox(e.ToString) 
 End Try 
  End Sub 
  Shared Sub Thread1() 
 ' Zur Demonstration der Quasiparallelität wird eine 
 ' blockierende Schleife verwendet. Ausserhalb eines 
 ' eigenen Threads würde neben diesem Code kein wei- 
 ' terer Code ausgeführt werden. 
 Do 
   Console.WriteLine("Hier ist Thread1. (Abbruch über Strg+C)") 
   Thread.Sleep(500) 
 Loop 
  End Sub 
  Shared Sub Thread2() 
 ' Zur Demonstration der Quasiparallelität wird eine 
 ' blockierende Schleife verwendet. Ausserhalb eines 
 ' eigenen Threads würde neben diesem Code kein wei- 
 ' terer Code ausgeführt werden. 
 Do 
   Console.WriteLine("Hier ist Thread2. (Abbruch über Strg+C)") 
   Thread.Sleep(500) 
 Loop 
  End Sub 
End Class

Datenübergabe an Threads
Möchten Sie vor dem Start eines Threads Daten an diesen übergeben, so können Sie solche Daten leider nicht einfach als Parameter der zugehörigen Startmethode des Threads weitergeben.

Sie können jedoch die Startmethode für einen Thread in einer Klasse definieren. So können Sie zunächst ein Objekt erzeugen, mit dem Sie beliebig kommunizieren können (und das beliebige Daten speichern kann), bevor Sie die Startmethode des Threads als Methode dieses Objekts aufrufen. Somit hat der erzeugte Thread selbstverständlich Zugriff auf die Daten dieses Objekts.

Auch für dieses Vorgehen soll ein einfaches Beispiel nicht fehlen. Der Code erzeugt zunächst ein Objekt der im Projekt definierten Klasse ThreadingData und übergibt an dieses Objekt das aktuelle Datum inkl. Uhrzeit (Now). Danach wird die StartThread-Methode des Objekts als Thread-Startmethode verwendet. Wie schon im obigen Beispiel gibt der so erzeugte Thread zyklisch einen String in das Konsolenfenster aus - diesmal aber ist darin die zuvor von außen an den Thread übergebene Uhrzeit enthalten.

Imports System.Threading 
' ... 
Class FreeThreading 
  Shared Sub Main() 
 Try 
   ' Ein Objekt für den Thread anlegen 
   Dim TObj As New ThreadingData 
   ' Ein Datum an das Objekt übergeben 
   TObj.DateTime = Now 
   ' Ein Thread-Objekt erzeugen 
   Dim T1 As New Thread(AddressOf TObj.StartThread) 
   ' Die Thread-Priorität festlegen 
   T1.Priority = ThreadPriority.Normal 
   ' Den Thread starten 
   T1.Start() 
   Do 
  Console.WriteLine("Hier ist das 'Hauptprogramm'.") 
  Thread.Sleep(500) 
   Loop 
 ' Fehler abfangen und ausgeben 
 Catch e As Exception 
   MsgBox(e.ToString) 
 End Try 
  End Sub 
End Class 
Public Class ThreadingData 
  ' Nimmt Daten für einen Thread auf und stellt die 
  ' Thread-Methode "StartThread" zur Verfügung 
  ' Öffentliche Eigenschaft (bewusst einfaches Beispiel) 
  Public DateTime As Date 
  Public Sub StartThread() 
 ' Threadverarbeitung mit Informationsübernahme  
 ' durch Eigenschaften dieser Klasse: 
 Do 
   Console.WriteLine("Der Thread wurde gestartet um " _ 
   & DateTime.ToShortTimeString) 
   Thread.Sleep(500) 
 Loop 
  End Sub 
End Class

Dieser MSDN Quickie konnte naturgemäß nur an der Oberfläche der vielfältigen Möglichkeiten des freien Threadings mithilfe des .NET Frameworks kratzen. Machen Sie sich auf Basis dieser simplen Beispiele mit der Technik des freien Threadings unter Visual Basic .NET vertraut - es lohnt sich!