使用Invoke时出现异常

时间:2014-08-06 08:55:21

标签: vb.net invoke

我的编程技巧非常基础。我试图在Visual Basic Express 2008中使用UDP创建客户端/服务器通信程序。 它是我写的另一个应用程序发送的消息的简单接收器。

问题是它从1台计算机接收时工作正常。如果我有两台或更多台计算机发送,它会在Invoke行中定期抛出异常。

以下是代码:

    Private Sub MigraReceiver_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        StartListening()

    End sub

    Private Sub ProcessPacket(ByVal ar As IAsyncResult)
            Dim Data As Byte()

            SyncLock UDPReadLock
                Try
                    Data = ListenSocket.EndReceive(ar, New System.Net.IPEndPoint(System.Net.IPAddress.Any, 0))
                Catch ex As Exception
                    ' Handle any exceptions here
                Finally
                    Try
                        UDPSyncResult = ListenSocket.BeginReceive(AddressOf ProcessPacket, UDPState)
                    Catch ex As Exception
                        ' Do nothing
                    End Try
                End Try
            End SyncLock

            ' Only attempt to process if we received data
            If Data.Length > 0 Then
                Dim Thread As New System.Threading.Thread(AddressOf SetText)
                Thread.Start(System.Text.Encoding.Unicode.GetString(Data))
                'SetText(System.Text.Encoding.Unicode.GetString(Data))
            End If
    End Sub

    Private Sub StartListening()
            Try
                ListenSocket = New System.Net.Sockets.UdpClient
                ListenSocket.Client.SetSocketOption(Net.Sockets.SocketOptionLevel.Socket, Net.Sockets.SocketOptionName.ReuseAddress, True)
                ListenSocket.Client.Bind(New System.Net.IPEndPoint(System.Net.IPAddress.Any, listenPort))
                UDPSyncResult = ListenSocket.BeginReceive(AddressOf ProcessPacket, UDPState)
            Catch ex As Exception
                'Handle an exception
            End Try
    End Sub


    Private Delegate Sub SetTextDelegate(ByVal [text] As String)


    Private Sub SetText(ByVal text As String)




            Dim espera_ordem As Integer = 0


            If Me.TabControl1.InvokeRequired Then

                'THIS IS WHERE IT THROWS THE EXCEPTION:
                Me.TabControl1.Invoke(New SetTextDelegate(AddressOf SetText), New Object() {text})   


            Else


            'Does GUI updates.

        End if

    End Sub     

它会抛出一个异常'Array out of bounds' Me.TabControl1.Invoke(New SetTextDelegate(AddressOf SetText),New Object(){text}) 线。

我一直在尝试,测试和搜索3天没有成功:( 当我在短时间内收到几个数据包时,似乎会出现问题。

任何帮助将不胜感激。感谢。

此致 麦克

P.S。 - 这是完整的SetText:

Private Sub SetText(ByVal text As String)

    Dim espera_ordem As Integer = 0

    If Me.InvokeRequired Then
        Me.Invoke(New SetTextDelegate(AddressOf SetText), New Object() {text})
    Else

        Dim partes() As String
        Dim subpartes() As String
        Dim login, maquina, mensagem As String

        partes = text.Split("-")
        subpartes = partes(0).Split(" ")
        maquina = Trim(subpartes(3))
        login = Trim(subpartes(4))
        mensagem = Trim(partes(1))

        Dim myIndex As Integer = logins.IndexOf(login)
        If myIndex = -1 Then
            TabControl1.Visible = True
            Dim NewTab As New TabPage
            NewTab.Name = login + "_tab"
            Dim text1 As New TextBox
            text1.Name = login + "_txt"
            text1.Multiline = True
            text1.ScrollBars = ScrollBars.Vertical
            text1.Size = New Size(570, 220)
            Me.TabControl1.Controls.Add(NewTab)
            NewTab.Controls.Add(text1)
            Dim but1 As New Button
            but1.Name = login + "_btn"
            but1.Location = New Point(3, 234)
            but1.Text = "Ai"
            but1.Visible = False
            AddHandler but1.Click, AddressOf Me.but1_Click
            NewTab.Controls.Add(but1)
            NewTab.Text = maquina + " " + login
            logins.Add(login)
            text1.Text = Now.ToString("t") + " - " + mensagem
            NewTab.Select()
        Else
            Dim tb1 As TextBox = CType(TabControl1.TabPages.Item(TabControl1.TabPages.Count - 1).Controls.Find(login + "_txt", True)(0), TextBox)
            tb1.Text = tb1.Text + Environment.NewLine + Now.ToString("t") + " - " + mensagem
        End If
    End if  
End Sub

1 个答案:

答案 0 :(得分:0)

好的,这对评论来说太长了,所以我不得不做出回答。对于其他任何阅读的人来说,这都是关于OP的评论。

我知道你说你检查text不是空的,或者是空的,但是你在检查它是否有短划线和空格?以下代码;

    partes = text.Split("-")
    subpartes = partes(0).Split(" ")
    maquina = Trim(subpartes(3))
    login = Trim(subpartes(4))
    mensagem = Trim(partes(1))

假设您有一个破折号和空格来分割数据。如果没有,您将获得Index was outside the bounds of the array例外。

要测试,试试这个;

Try
    partes = text.Split("-")
    subpartes = partes(0).Split(" ")
    maquina = Trim(subpartes(3))
    login = Trim(subpartes(4))
    mensagem = Trim(partes(1))

Catch ex As Exception
    MessageBox.Show(ex.Message, "SPLITTING FAILED!!")
End Try

这应该会帮助你一路走来!