当我在线程中引发事件时,该线程不再在循环中运行。
Public Sub readStream()
Dim netStream As NetworkStream = Me.client.GetStream()
Do
Try
Dim inStream As Byte() = New Byte(20000) {}
netStream.Read(inStream, 0, CInt(Me.client.ReceiveBufferSize))
Console.WriteLine("Received something")
RaiseEvent rsh(Me, New ReceiveStreamEvent(System.Text.Encoding.ASCII.GetString(inStream)))
Console.WriteLine("I am still alive")
Catch ex As Exception
Console.WriteLine("ReadStream Error: " & ex.Message.ToString())
End Try
Thread.Sleep(100)
Loop
End Sub我没有错误,没有消息。
下面是完整的类:
Imports System.Collections.Generic
Imports System.Linq
Imports System.Text
Imports System.Net.Sockets
Imports System.Threading
Public Delegate Sub ReceiveStreamHandler(source As Object, e As ReceiveStreamEvent)
Public Class ReceiveStreamEvent
Inherits EventArgs
Private stream As String
Public Sub New(stream As String)
Me.stream = stream
End Sub
Public Function getStream() As String
Return Me.stream
End Function
End Class
Public Class server
Private client As TcpClient
Private readThread As Thread
Public Event rsh As ReceiveStreamHandler
Public Sub New()
Try
Me.client = New TcpClient("172.16.26.56", 8000)
Me.readThread = New Thread(AddressOf readStream)
Me.readThread.Start()
Me.readThread.Priority = ThreadPriority.Highest
Catch ex As Exception
Console.WriteLine("TCP conn error: " & ex.Message.ToString())
End Try
End Sub
Public Sub disconnect()
Try
Me.readThread.Abort()
Me.client.Close()
Catch ex As Exception
Console.WriteLine("TCP disc error: " & ex.Message.ToString())
End Try
End Sub
Public Sub readStream()
Dim netStream As NetworkStream = Me.client.GetStream()
Do
Try
Dim inStream As Byte() = New Byte(20000) {}
netStream.Read(inStream, 0, CInt(Me.client.ReceiveBufferSize))
Console.WriteLine("Received something")
RaiseEvent rsh(Me, New ReceiveStreamEvent(System.Text.Encoding.ASCII.GetString(inStream)))
Console.WriteLine("I am still alive")
Catch ex As Exception
Console.WriteLine("ReadStream Error: " & ex.Message.ToString())
End Try
' Thread.Sleep(100)
Loop
End Sub
Public Sub writeStream(message As String)
Dim netStream As NetworkStream = Me.client.GetStream()
Dim outStream As Byte() = System.Text.Encoding.ASCII.GetBytes(message)
netStream.Write(outStream, 0, outStream.Length)
netStream.Flush()
End Sub
End Class发布于 2014-10-10 22:23:56
与其说它是一个答案,不如说它是一个解决方案,但下面的代码显示了我的sub正在处理这个事件。当在e.getStream()上使用Console.WriteLine时,它只显示一次结果,然后再也不会查找其余代码或线程。我已经把它放在注释中了,现在一切都正常了。即使我在其他地方使用e.getStream(),它也能正常工作。这种情况真的让我对VB.NET很生气,即使C#稍微有点“相同”,但它更清晰,更容易理解。对于这个消耗的Console.WriteLine,我仍然没有答案,如果这里的一些朋友能考虑一下,我会很高兴的。因为这是一件非常隐秘的事情。
Private Sub receiveData(source As Object, e As ReceiveStreamEvent) Handles apiServer.rsh
Try
' Me.richTextBox_DATA.Invoke(New MethodInvoker(Sub() Me.richTextBox_DATA.Text = Me.richTextBox_DATA.Text + e.getStream()))
' Console.WriteLine(e.getStream())
Dim list As String() = e.getStream().Split(New String() {vbLf, vbCr & vbLf}, StringSplitOptions.RemoveEmptyEntries)
For Each str As String In list
If str.StartsWith("RESP") Then
Me.parseResp(str)
End If
If str.StartsWith("LOGOUT") Then
Me.parseLogout(str)
End If
If str.StartsWith("LOGIN") Then
Me.parseLogin(str)
End If
If str.StartsWith("GPS") Then
Console.WriteLine("GPSGPS")
End If
Next
Catch ex As Exception
Console.WriteLine(ex.Message)
End Try
End Subhttps://stackoverflow.com/questions/26299778
复制相似问题