In VB.NET stehen folgende Mechanismen für Multithreading zur Verfügung:
Thread (System.Threading.Thread) — manuelles Erstellen und Starten von Threads. Erfordert detaillierte Verwaltung, geeignet für einfache Szenarien.BackgroundWorker — praktisch für asynchrone Operationen in Windows Forms-Anwendungen (UI bleibt reaktionsschnell).Task Parallel Library (TPL), einschließlich der Klassen Task und dem Schlüsselwort Async/Await. Moderner und empfohlener Ansatz.Synchronisation:
SyncLock), Mutexes, Semaphore — zum Schutz kritischer Abschnitte und zum Zugriff auf gemeinsame Ressourcen.Beispiel:
' Starten einer parallelen Aufgabe Imports System.Threading.Tasks Sub StartJob() Task.Run(Sub() ' Lange Operation Console.WriteLine("Arbeiten in einem separaten Thread") End Sub) End Sub ' Verwendung von SyncLock zur Synchronisation Dim locker As New Object() Sub SafeIncrement() SyncLock locker ' Code hier wird atomar ausgeführt End SyncLock End Sub
Kann man von jedem Thread aus frei auf Steuerelemente in Windows Forms zugreifen? Warum/oder warum nicht?
Antwort:
Nein, der Zugriff auf WinForms-Steuerelemente ist nur aus dem Thread möglich, in dem sie erstellt wurden (in der Regel dem Haupt-UI-Thread). Ein Verstoß dagegen führt zu unvorhersehbaren Fehlern oder Abstürzen. Um die UI aus einem anderen Thread zu aktualisieren, verwendet man die Methoden Invoke oder BeginInvoke.
Beispiel:
If TextBox1.InvokeRequired Then TextBox1.Invoke(Sub() TextBox1.Text = "Daten aus dem Thread" End Sub) Else TextBox1.Text = "Daten aus dem Thread" End If
Geschichte
In einer Serveranwendung wurden bei der Arbeit mit gemeinsamen Listen keine Synchronisationsmechanismen verwendet. Ergebnis — gelegentlich traten InvalidOperationException-Ausnahmen auf und die Daten "brachen zusammen".
Geschichte
In einer Windows-Anwendung wurden Steuerelemente aus einem Hintergrundthread über BackgroundWorker aktualisiert. Die Anwendung stürzte manchmal ohne klare Fehlermeldungen ab — Grund: direkte Änderung der UI außerhalb des thread-sicheren Zugriffs.
Geschichte
Ein Programmierer startete mehrere Threads, von denen jeder eine globale Variable ohne SyncLock änderte. Ergebnis — Datenrennen, falsche Berechnungsergebnisse, schwer fassbare Bugs und häufige Abstürze in der Berichterstattung.