首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 更多程式設計知識

VB.NET 多執行緒程式設計完整指南:從建立到同步化

     編輯:更多程式設計知識

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 執行緒。

執行緒同步化機制

1. SyncLock(關鍵區段)

Public Sub CalcSquare()
    SyncLock GetType(SquareClass) ' 使用型別物件作同步鎖
        Result = Value * Value
    End SyncLock
End Sub

確保同一時間只有一個執行緒進入區塊,保護共享資料。

2. Thread.Join(等待完成)

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 指示是否正常結束。

3. 其他同步原語(進階)

  • Monitor.Enter/Exit:SyncLock 底層實作,支援 TryEnter 非阻塞嘗試。
  • Mutex:跨處理序同步。
  • AutoResetEvent/ManualResetEvent:訊號通知機制。
  • ReaderWriterLockSlim:讀多寫少場景優化。

UI 執行緒安全存取模式

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 非同步模式。掌握這些,即能開發高回應、高並行的專業級應用程式。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved