I am working on a project that have a server, whenever a clients connects it stores its user_id, ip in the dictionary which i have used. When I store the information between the different threads it is working but when I try to access the dictionary from different threads, it's not working well.
Let me clear what my code should do: There is one main thread active and listening for clients, when a clients wants to connect, main thread creates a child thread and that thread gets connected with client, client sends it a user_id, this user_id (as key for dictionary) and Tcpclient (as Value) get stored in dictionary. Further one client sends a message for particular client to server, that message contains the user_id for receiver. Now this client is connected with a particular thread which will check the key(user_id) in dictionary and then send the data to that client but dictionary is not giving the correct value for connected clients it just returns false even that client is connected.
Below is my code example.
Imports System.Net
Imports System.Net.Sockets
Imports System.Text
Imports System.IO
Public Class Mainform
Dim _server As TcpListener
Dim _listOfClients As New Dictionary(Of String, TcpClient)
Public MessageQueue As New Dictionary(Of String, Queue(Of String))
'Dim ClientData As StreamReader
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Try
        Dim port As Integer = 8888
        _server = New TcpListener(System.Net.IPAddress.Any, port)
        _server.Start()
        Threading.ThreadPool.QueueUserWorkItem(AddressOf NewClient)
    Catch ex As Exception
        MsgBox(ex.Message)
    End Try
End Sub
Private Sub NewClient()
    Dim client As TcpClient = _server.AcceptTcpClient()
    Dim toRec(100000) As Byte
    Dim nss As NetworkStream = client.GetStream()
    nss.Read(toRec, 0, toRec.Length)
    Dim ClientData As String = Encoding.ASCII.GetString(toRec)
    MsgBox("Client Connected: " & ClientData)
    Dim too() As String
    Dim status As Boolean = False
    Dim sendto As String
    Try
        _listOfClients.Add(ClientData, client)
        Threading.ThreadPool.QueueUserWorkItem(AddressOf NewClient)
        While True
            Dim thisClient As String = ClientData
            Dim ns As NetworkStream = client.GetStream()
            Dim toRecieve(100000) As Byte
            ns.Read(toRecieve, 0, toRecieve.Length)
            Dim txt As String = Encoding.ASCII.GetString(toRecieve)
            'MsgBox(txt)
                too = txt.Split("@") 'server receives data in single string where user_id and message is connected with '@'
                sendto = String.Copy(too(0)) 'this is the user_id of receiver client 
                   If _listofclients.ContainsKey(sendto) Then
                        Dim data As String
                        data = String.Join("#", too)
                        Dim buffer As Byte() = Encoding.ASCII.GetBytes(data)
                        Dim nets As NetworkStream = _listofclients(sendto).GetStream()
                        nets.Write(buffer, 0, buffer.Length)
                   End If
                End While
    Catch ex As Exception
        MsgBox(ex.Message)
    End Try
End Sub
End Class