Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 使用Invoke时发生异常_Vb.net_Invoke - Fatal编程技术网

Vb.net 使用Invoke时发生异常

Vb.net 使用Invoke时发生异常,vb.net,invoke,Vb.net,Invoke,我的编程技能非常基础。我正在尝试在VisualBasicExpress2008中使用UDP编写一个客户机/服务器通信程序。 它是一个简单的接收器,用于接收我编写的另一个应用程序发送的消息 问题是,当它从一台计算机接收数据时,它工作正常。如果有两台或更多计算机发送,它会在调用行中定期抛出异常 代码如下: Private Sub MigraReceiver_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Han

我的编程技能非常基础。我正在尝试在VisualBasicExpress2008中使用UDP编写一个客户机/服务器通信程序。 它是一个简单的接收器,用于接收我编写的另一个应用程序发送的消息

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

代码如下:

    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     
它在 Me.TabControl1.Invoke(New SetTextDelegate(AddressOf SetText),New Object(){text}) 线路

我已经尝试、测试和搜索了3天,但都没有成功:( 当我在短时间内收到多个数据包时,问题似乎就出现了

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

问候,, 迈克

附言-这是完整的文本:

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

好的,这对评论来说太长了,所以我不得不给它一个答案。对于其他阅读的人,下面是OP上的评论

我知道你说过你在检查
text
不是空的,但是你在检查它是否有破折号和空格??下面的代码

    partes = text.Split("-")
    subpartes = partes(0).Split(" ")
    maquina = Trim(subpartes(3))
    login = Trim(subpartes(4))
    mensagem = Trim(partes(1))
假设您有一个破折号和空格来分割数据。如果没有,您将得到
索引超出数组的界限
异常

要测试,试试这个

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

这应该会对您有所帮助!

您是否尝试过检查
文本的内容?
?可能它是空的/空的/什么都没有。在调用委托之前测试它。感谢您的回答。文本不是空的。我已经测试过了。在catch中,我打印了变量,它从来都不是空的。:(尝试更改
Me.TabControl1.Invoke(…)
只调用
Me.Invoke(…)
-即不引用选项卡控件,引用表单。“数组超出范围”不是.NET生成的异常消息。它可能是指超出范围的索引。发布准确信息对于获取帮助非常重要。这包括必须发布异常的堆栈跟踪,以便明确错误所在。使用“调试+异常”,勾选“抛出”复选框以获取mos调用()前不准确的堆栈跟踪会使其损坏。@Grim:仅使用我。调用也会导致异常。:(如果我从一台计算机收到消息,它运行得很好。如果我同时在两台计算机上运行发送应用程序……我会得到这些异常。Grim:我假设是因为我有。始终:)我已经试过了,但也不例外。而且……当只有一台计算机在发送时,它不起作用,但它确实起作用了。我在这里发疯了:(嗯,好的,在你的整个例程中放一个
Try…Catch
,产生错误,然后检查整个堆栈跟踪-一次一行!很难看到你的网络发生了什么;但是如果只有>1个客户端发生,就需要检查端口、冲突和所有这些jazz。好的……我想我已经将错误缩小到了t这两行使用try/catch:Dim tb1作为TextBox=CType(TabControl1.TabPages.Item(TabControl1.TabPages.Count-1).Controls.Find(login+“_txt”,True)(0),textb1.Text=tb1.Text+Environment.NewLine+Now.ToString(“t”)+“-”+mensagem我做错了什么?这是一个全新的问题。我建议你开始一个新的问题-这个问题变得有点陈旧和过时!确保你给出异常详细信息!