我无法从另一个线程访问列表框并且在 vb.net 中不需要调用

I cannot access listbox from another thread and invoke is not required in vb.net

我希望有人能帮助我。我正在尝试从另一个线程访问列表框,很少见的是 invokerequired 给我 "false",它应该能够直接访问它但没有任何反应,该项目没有添加到 listbox.

这是我的代码,在此先感谢:

Imports System.Threading
Imports System.Net
Imports System.Net.Sockets

Public Class FrmTCPServer
    Dim fn, temp_file, str_rute, str_filename, str_content, file_name, clNo, NewText As String
    Dim file_len, recfilelen, counter As Integer

    Dim serverSocket As New TcpListener(IPAddress.Any, 9088)
    Dim clientSocket As TcpClient

    Public thread As Thread = Nothing

    Private Sub FrmServer_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Lbconn.Items.Clear()

        Dim IPHost As IPHostEntry = Dns.GetHostEntry(Dns.GetHostName)
        lblStatus.Text = "My IP address is " + IPHost.AddressList(1).ToString()
    End Sub

    Private Sub Btnstart_Click(sender As Object, e As EventArgs) Handles Btnstart.Click
        serverSocket.Start()

        ThreadProcSafe("Server Started")

        thread = New Thread(New ThreadStart(AddressOf listenerThread))
        thread.Start()
    End Sub

    Private Sub listenerThread()
        While (True)
            counter += 1
            clientSocket = serverSocket.AcceptTcpClient()
            ThreadProcSafe("Client No: " & Convert.ToString(counter) & " IP: " & (IPAddress.Parse(CType(clientSocket.Client.RemoteEndPoint, IPEndPoint).Address.ToString())).ToString() & " Started!")

            Dim client1 As New FrmTCPServer
            client1.startClient(clientSocket, Convert.ToString(counter))
        End While
    End Sub

    Public Sub startClient(ByVal clientSocket As TcpClient, ByVal counter As Integer)
        thread = New Thread(New ThreadStart(AddressOf handlerThread))
        thread.Start()
    End Sub

    Private Sub handlerThread()
        ThreadProcSafe("Receiving File... ")
    End Sub

    Sub ThreadProcSafe(item As Object)
        If Lbconn.InvokeRequired Then
            Lbconn.Invoke(Sub() Lbconn.Items.Add(item & " (Invoke)"))
        Else
            Lbconn.Items.Add(item & " (No Invoke)") '**Here pass whith no exception but does not add the item to the listbox**
        End If
    End Sub
End Class

ThreadProcSafe方法更改为以下代码并重试:

Sub ThreadProcSafe(item As Object)
    If Lbconn.InvokeRequired Then
        Lbconn.Invoke(Sub() Lbconn.Items.Add(item))
    Else
        Lbconn.Items.Add(item)
    End If
End Sub

listenerThread方法中:

Private Sub listenerThread()
    While (True)
        counter += 1
        clientSocket = serverSocket.AcceptTcpClient()
        ThreadProcSafe("Client No: " & Convert.ToString(counter) & " IP: " & (IPAddress.Parse(CType(clientSocket.Client.RemoteEndPoint, IPEndPoint).Address.ToString())).ToString() & " Started!")

        Dim client1 As New FrmTCPServer ' *** THIS PLACE ***
        client1.startClient(clientSocket, Convert.ToString(counter))
    End While
End Sub

您创建新的 FrmTCPServer 表单,然后对新对象调用 startClient。因此,您在新列表中添加的数据没有这种形式,即 运行!

您应该将 listenerThread 方法更改为:

Private Sub listenerThread()
    While (True)
        counter += 1
        clientSocket = serverSocket.AcceptTcpClient()
        ThreadProcSafe("Client No: " & Convert.ToString(counter) & " IP: " & (IPAddress.Parse(CType(clientSocket.Client.RemoteEndPoint, IPEndPoint).Address.ToString())).ToString() & " Started!")

        Me.startClient(clientSocket, Convert.ToString(counter))
    End While
End Sub