Vb.net 使用Invoke时发生异常
我的编程技能非常基础。我正在尝试在VisualBasicExpress2008中使用UDP编写一个客户机/服务器通信程序。 它是一个简单的接收器,用于接收我编写的另一个应用程序发送的消息 问题是,当它从一台计算机接收数据时,它工作正常。如果有两台或更多计算机发送,它会在调用行中定期抛出异常 代码如下: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
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我做错了什么?这是一个全新的问题。我建议你开始一个新的问题-这个问题变得有点陈旧和过时!确保你给出异常详细信息!