首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >线程中的VB.NET RaiseEvent

线程中的VB.NET RaiseEvent
EN

Stack Overflow用户
提问于 2014-10-10 20:45:38
回答 1查看 659关注 0票数 0

当我在线程中引发事件时,该线程不再在循环中运行。

代码语言:javascript
复制
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

我没有错误,没有消息。

下面是完整的类:

代码语言:javascript
复制
 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
EN

回答 1

Stack Overflow用户

发布于 2014-10-10 22:23:56

与其说它是一个答案,不如说它是一个解决方案,但下面的代码显示了我的sub正在处理这个事件。当在e.getStream()上使用Console.WriteLine时,它只显示一次结果,然后再也不会查找其余代码或线程。我已经把它放在注释中了,现在一切都正常了。即使我在其他地方使用e.getStream(),它也能正常工作。这种情况真的让我对VB.NET很生气,即使C#稍微有点“相同”,但它更清晰,更容易理解。对于这个消耗的Console.WriteLine,我仍然没有答案,如果这里的一些朋友能考虑一下,我会很高兴的。因为这是一件非常隐秘的事情。

代码语言:javascript
复制
 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 Sub
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26299778

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档