单击按钮时在vb.net中启动新线程

时间:2015-09-18 01:32:26

标签: vb.net multithreading buttonclick

单击按钮时,我需要帮助在新线程中运行函数。在我的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地址处打开。

1 个答案:

答案 0 :(得分:1)

创建新Thread时,您必须传递ThreadStart代理人或ParameterizedThreadStart代理人。 ThreadStartSub,没有参数,ParameterizedThreadStartSub,其中一个参数类型为Object。这意味着您的线程输入方法必须具有与这两者中的一个匹配的签名。您的IsPortOpen失败了,因为它是Function并且它有两个参数,而且它们都不是Object类型。如果你真的想在辅助线程上执行该方法,那么你必须从另一个具有兼容签名的方法中调用它,并使其成为你的线程入口方法。

那说,重点是什么?你已经在当前线程上调用了IsPortOpen,即使你不是,你也无法访问它在另一个线程上调用它时返回的值,即使你可以,你也可以在你甚至不知道它已经被生成之前,尝试在当前线程上使用该值。基本上,你的多线程代码实际上没有任何意义。