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

VB.NET 多執行緒 Socket 發送線程安全:鎖定與佇列兩種同步模式

     編輯:程式設計綜合問答

問題場景

主執行緒持有 SocketWrapper s,兩個子執行緒同時呼叫 s.Send(),未同步可能導致資料交錯、Socket 錯誤。

方案一:鎖定關鍵區段(簡單、低併發適用)

Private ReadOnly _sendLock As New Object()

Public Sub Send(data As Byte())
    SyncLock _sendLock
        _socket.Send(data)
    End SyncLock
End Sub

方案二:生產者-消費者佇列(高併發、解耦)

Private ReadOnly _sendQueue As New ConcurrentQueue(Of Byte())
Private _senderTask As Task

Public Sub Start()
    _senderTask = Task.Run(Sub()
        While True
            If _sendQueue.TryDequeue(out Dim data) Then
                _socket.Send(data)
            Else
                Thread.Sleep(1) // 避免忙等待
            End If
        End While
    End Sub)
End Sub

Public Sub Send(data As Byte())
    _sendQueue.Enqueue(data)
End Sub

選擇指南

場景推薦方案
發送頻率低 (<100/s)、資料小方案一 鎖定
高頻、大資料、需保證順序方案二 佇列
需支援取消、背壓控制方案二 + CancellationToken

注意事項

  • Socket.Send 本身非執行緒安全,多執行緒並發呼叫會導致 WSAEINVAL 或資料損壞。
  • 佇列方案將 Socket 操作集中在單一專用執行緒,天然序列化,也便於加入重試、斷線重連邏輯。
  • 關閉時務必 _sendQueue.CompleteAdding() 並 _senderTask.Wait()。

總結

VB.NET 多執行緒共用 Socket 發送,必須同步。低併發用 SyncLock,高併發用 ConcurrentQueue + 專用發送執行緒,後者擴充性更強。

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