2015-09-18 3 views
0

Мне нужна помощь при запуске функции в новом потоке при нажатии кнопки. На моем frmMain у меня есть 2 текстовых поля и кнопка. Существуют и другие элементы управления, которые работают в своих потоках, но я не могу заставить этот конкретный работать.Начать новую тему в vb.net при нажатии кнопки

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 

Если я использую этот код в кнопку мыши подразделам:

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 

Я получаю эту ошибку: «Error BC31143 метод 'Private Function IsPortOpen (Host As String, Portnumber As Integer) As Boolean' не имеет подписи, совместимой с делегатом «Delegate Sub ThreadStart()». Camera Watchdog F: \ dontdig \ frmMain.vb 177 «

Это просто проверяет, открыт ли конкретный порт по IP-адресу, указанному в текстовое окно.

ответ

1

При создании нового Thread вы должны передать делегат ThreadStart или делегат ParameterizedThreadStart. ThreadStart - Sub без параметров, а ParameterizedThreadStart - это Sub с одним параметром Object. Это означает, что ваш метод ввода потока должен иметь подпись, которая соответствует одной из этих двух. Ваш IsPortOpen терпит неудачу в том, что это Function и что он имеет два параметра, и ни один из них не является типом Object. Если вы действительно хотели выполнить этот метод во вторичном потоке, вам придется вызывать его из другого метода, у которого была совместимая подпись, и сделать этот метод записи потока.

Было сказано, какой смысл? Вы уже звонили IsPortOpen в текущем потоке, и даже если бы вы этого не сделали, вы не можете получить доступ к значению, которое оно возвращает при вызове в другом потоке, и даже если вы можете, вы пытаетесь использовать это значение в текущем потоке, прежде чем вы даже можете знать, что он был сгенерирован. В принципе, ваш многопоточный код на самом деле не имеет никакого смысла.

Смежные вопросы