你好,stackoverflow!我将切入正题:我有一个使用 TCP 的服务器/客户端程序,我在用于放入读取数据包的队列中遇到了一些问题。一旦读取数据包,它就会被排入队列,并且如果程序不忙于处理数据包,它将处理它并将其从队列中取出。
下面是对数据进行排队的代码:
If ReadIndex = ReadBuffer.Length Then
SyncLock ReadQueue
ReadQueue.Enqueue(ReadBuffer)
End SyncLock
File.WriteAllBytes(Application.StartupPath & "\Test\" & I & ".bin", ReadBuffer)
I += 1
If Not Processing(2) Then
Processing(2) = True
If Not ThreadPool.QueueUserWorkItem(AddressOf HandleReadQueue) Then HandleReadQueue()
End If
End If
请注意,我正在将所有数据包写入每个自己的文件(这是出于调试目的)。我使用 ThreadPool 来处理不同线程上的 readqueue。
这是处理队列的方法:
Private Sub HandleReadQueue()
Dim Data As Byte()
SyncLock ReadQueue
Data = ReadQueue.Dequeue()
End SyncLock
File.WriteAllBytes(Application.StartupPath & "\TestReadQueue\" & Y & ".bin", Data)
Y += 1
If _Parent IsNot Nothing Then
HandleClientReadPacket(_Parent, _Pipename, Data)
Else
HandleClientReadPacket(Me, Nothing, Data)
End If
End Sub
TestReadQueue 中的文件与 Test 文件夹中的文件不同。我不知道为什么。而且我知道所有数据都被接收,因为排队的数据与客户端发送的数据相同。
在这里你可以看到它的不同: http: //gyazo.com/feb4a192e47f262a9f23812ae8bc6cf6
当我使用 ThreadPool 时不会出现这个问题,但是当我不使用 SyncLock 时就没有必要了。谁能告诉我出了什么问题?