W VB.NET dostępne są następujące mechanizmy do wielowątkowości:
Thread (System.Threading.Thread) — ręczne tworzenie i uruchamianie wątków. Wymaga szczegółowego zarządzania, odpowiednia dla prostych scenariuszy.BackgroundWorker — wygodna dla operacji asynchronicznych w aplikacjach Windows Forms (UI pozostaje responsywny).Task Parallel Library (TPL), w tym klasy Task oraz słowo kluczowe Async/Await. Nowoczesne i zalecane podejście.Synchronizacja:
SyncLock), muteksy, semafory — do ochrony krytycznych sekcji i dostępu do współdzielonych zasobów.Przykład:
' Uruchamianie równoległego zadania Imports System.Threading.Tasks Sub StartJob() Task.Run(Sub() ' Długa operacja Console.WriteLine("Pracuję w osobnym wątku") End Sub) End Sub ' Użycie SyncLock do synchronizacji Dim locker As New Object() Sub SafeIncrement() SyncLock locker ' Kod tutaj zostanie wykonany atomowo End SyncLock End Sub
Czy można swobodnie uzyskiwać dostęp do elementów sterujących Windows Forms z dowolnego wątku? Dlaczego/Nie?
Odpowiedź:
Nie, dostęp do elementów sterujących WinForms jest możliwy tylko z tego wątku, w którym zostały one utworzone (zazwyczaj — głównego wątku UI). Naruszenie tego prowadzi do nieprzewidywalnych błędów lub awarii. Aby zaktualizować UI z innego wątku używa się metod Invoke lub BeginInvoke.
Przykład:
If TextBox1.InvokeRequired Then TextBox1.Invoke(Sub() TextBox1.Text = "Dane z wątku" End Sub) Else TextBox1.Text = "Dane z wątku" End If
Historia
W aplikacji serwerowej nie zastosowano żadnych mechanizmów synchronizacji podczas pracy z wspólnymi listami. Efekt — okresowe pojawianie się wyjątków InvalidOperationException oraz "rozpad" danych.
Historia
W aplikacji Windows aktualizowano elementy sterujące z wątku tła za pomocą BackgroundWorker. Aplikacja czasami "wychodziła" bez wyraźnych komunikatów — przyczyna: bezpośrednia zmiana UI poza bezpiecznym dostępem dla wątków.
Historia
Programista uruchomił kilka wątków, z których każdy zmieniał zmienną globalną bez SyncLock. Efekt — wyścig danych, nieprawidłowe wyniki obliczeń, trudne do wyśledzenia błędy i częste awarie raportowania.