单击按钮时,我需要帮助在新线程中运行函数。在我的frmMain上,我有2个文本框和一个按钮。还有其他控件,它们在自己的线程中运行,但我不能让这个特定的控件工作。
Private Function IsPortOpen(ByVal Host As String, ByVal PortNumber As Integer) As Boolean
Dim Client As TcpClient = Nothing
Try
Client = New TcpClient(Host, PortNumber)
Return True
Catch ex As SocketException
Return False
Finally
If Not Client Is Nothing Then
Client.Close()
End If
End Try
End Function
Private Sub btnCheckPort_Click(sender As Object, e As EventArgs) Handles btnCheckPort.Click
Dim Port As Integer = tbPortNumber.Text
Dim Hostname As String = tbHostAddress.Text
Dim PortOpen As Boolean = IsPortOpen(Hostname, Port)
Try
If PortOpen = True Then
lblPortStatus.Text = "Port " & tbPortNumber.Text & " is Open on " & tbHostAddress.Text
Else
lblPortStatus.Text = "Port " & tbPortNumber.Text & " is Not Open on " & tbHostAddress.Text
End If
Catch ex As Exception
End Try
End Sub
如果我在按钮中使用此代码,请单击sub:
Private Sub btnCheckPort_Click(sender As Object, e As EventArgs) Handles btnCheckPort.Click
Dim Port As Integer = tbPortNumber.Text
Dim Hostname As String = tbHostAddress.Text
Dim PortOpen As Boolean = IsPortOpen(Hostname, Port)
manualCheckThread = New Threading.Thread(AddressOf IsPortOpen)
manualCheckThread.Start()
Try
If PortOpen = True Then
lblPortStatus.Text = "Port " & tbPortNumber.Text & " is Open on " & tbHostAddress.Text
Else
lblPortStatus.Text = "Port " & tbPortNumber.Text & " is Not Open on " & tbHostAddress.Text
End If
Catch ex As Exception
End Try
End Sub
我收到此错误:“错误BC31143方法'私有函数IsPortOpen(Host As String,PortNumber As Integer)As Boolean'没有与委托'Delegate Sub ThreadStart()'兼容的签名。Camera Watchdog F:\ dontdig \ frmMain.vb 177“
这只是检查特定端口是否在文本框中指定的IP地址处打开。
答案 0 :(得分:1)
创建新Thread
时,您必须传递ThreadStart
代理人或ParameterizedThreadStart
代理人。 ThreadStart
是Sub
,没有参数,ParameterizedThreadStart
是Sub
,其中一个参数类型为Object
。这意味着您的线程输入方法必须具有与这两者中的一个匹配的签名。您的IsPortOpen
失败了,因为它是Function
并且它有两个参数,而且它们都不是Object
类型。如果你真的想在辅助线程上执行该方法,那么你必须从另一个具有兼容签名的方法中调用它,并使其成为你的线程入口方法。
那说,重点是什么?你已经在当前线程上调用了IsPortOpen
,即使你不是,你也无法访问它在另一个线程上调用它时返回的值,即使你可以,你也可以在你甚至不知道它已经被生成之前,尝试在当前线程上使用该值。基本上,你的多线程代码实际上没有任何意义。