VB6 僅支援多單元(Apartment)模型,各單元獨立執行緒、資料隔離;VB.NET 引入 CLR,完整支援自由執行緒模型,多執行緒可共享記憶體資料,極大提升回應性與並行處理能力。本文系統說明執行緒建立、控制、參數傳遞、同步化四大核心主題。
Imports System.Threading
Public Class Form1
Private t As Thread
Private Sub BackgroundProcess()
Dim i As Integer = 1
Do While True
ListBox1.Items.Add("Iterations: " & i)
i += 1
Thread.CurrentThread.Sleep(2000) ' 降低頻率
Loop
End Sub
Private Sub btnStart_Click(sender As Object, e As EventArgs) Handles btnStart.Click
t = New Thread(AddressOf Me.BackgroundProcess)
t.Start() ' 非同步啟動
End Sub
Private Sub btnStop_Click(sender As Object, e As EventArgs) Handles btnStop.Click
t.Abort() ' 強制終止
End Sub
End Class
關鍵點:AddressOf 建立型別安全委派,Start() 將方法排入執行緒池,UI 執行緒不被阻塞,按鈕即時回應。
| 方法 | 用途 | 備註 |
|---|---|---|
Sleep(ms) | 暫停指定毫秒 | 立即進入等待 |
Sleep(Timeout.Infinite) | 無限期暫停 | 需 Interrupt() 喚醒 |
Suspend() | 請求掛起 | 非立即,待 CLR 安全點才掛起(已過時) |
Resume() | 恢復掛起執行緒 | 配合 Suspend(已過時) |
Abort() | 終止執行緒 | 拋出 ThreadAbortException,需捕捉清理 |
最佳實務:避免使用Suspend/Resume與Abort,改用CancellationToken或旗標變數協同結束,防止資源洩漏或鎖死。
執行緒啟動方法不可帶參數、無回傳值。解決方案:封裝至類別,以欄位攜帶資料。
Public Class SquareClass
Public Value As Double
Public Result As Double
Public Event Completed(ByVal result As Double)
Public Sub CalcSquare()
Result = Value * Value
RaiseEvent Completed(Result)
End Sub
End Class
Private WithEvents sq As SquareClass
Private Sub btnCalc_Click(sender As Object, e As EventArgs) Handles btnCalc.Click
sq = New SquareClass()
sq.Value = 30
Dim t As New Thread(AddressOf sq.CalcSquare)
t.Start()
End Sub
Private Sub sq_Completed(result As Double) Handles sq.Completed
MessageBox.Show("平方結果: " & result)
' 注意:此事件在背景執行緒引發,更新 UI 需 Invoke
End Sub
警告:事件處理常式在背景執行緒執行,存取 UI 控制項必須用 Control.Invoke 或 BeginInvoke 封送回 UI 執行緒。
Public Sub CalcSquare()
SyncLock GetType(SquareClass) ' 使用型別物件作同步鎖
Result = Value * Value
End SyncLock
End Sub
確保同一時間只有一個執行緒進入區塊,保護共享資料。
Private Sub btnCalcJoin_Click(sender As Object, e As EventArgs) Handles btnCalcJoin.Click
Dim sq As New SquareClass()
sq.Value = 30
Dim t As New Thread(AddressOf sq.CalcSquare)
t.Start()
If t.Join(500) Then ' 等待最多 500ms
MessageBox.Show("結果: " & sq.Result)
Else
MessageBox.Show("逾時未完成")
End If
End Sub
Join 封鎖呼叫執行緒直到目標執行緒結束或逾時,回傳 Boolean 指示是否正常結束。
Monitor.Enter/Exit:SyncLock 底層實作,支援 TryEnter 非阻塞嘗試。Mutex:跨處理序同步。AutoResetEvent/ManualResetEvent:訊號通知機制。ReaderWriterLockSlim:讀多寫少場景優化。Private Sub SafeUpdateUI(text As String)
If ListBox1.InvokeRequired Then
ListBox1.Invoke(Sub() ListBox1.Items.Add(text))
Else
ListBox1.Items.Add(text)
End If
End Sub
所有跨執行緒 UI 操作必須檢查 InvokeRequired 並透過委派封送。
VB.NET 多執行緒模型建立於 CLR 之上,提供豐富同步工具。核心原則:最小化共享狀態、慎用 Abort/Suspend、UI 操作必須封送、善用 Join/事件/Task 非同步模式。掌握這些,即能開發高回應、高並行的專業級應用程式。