private void ListenThread()
        {
            Task clientTask = new Task((c) =>
            {
                while (true)
                {
                    Byte[] bytes;
                    try
                    {
                        if (!TCPUtilities.IsConnected(tcpClient))
                        {
                            throw new Exception("Client Disconnected");
                        }

                        NetworkStream ns = tcpClient.GetStream();
                        if (tcpClient.ReceiveBufferSize > 0)
                        {
                            bytes = new byte[tcpClient.ReceiveBufferSize];
                            ns.Read(bytes, 0, tcpClient.ReceiveBufferSize);
                            string msg = Encoding.ASCII.GetString(bytes);

                            ReceivedMessage message = new ReceivedMessage((Client)c, msg);

                            if (onReceiveCallback != null)
                            {
                                onReceiveCallback.Invoke(message);
                            }
                        }
                    }
                    catch
                    {
                        if (onDisconnectCallBack != null)
                        {
                            onDisconnectCallBack.Invoke((Client)c);
                        }

                        break;
                    }
                }
            }, client);

            clientTask.Start();
            ListenTask = clientTask;
        }
        private void StartListeningThread()
        {
            Thread listenConnection = new Thread(async() =>
            {
                while (true)
                {
                    TcpClient tcpClient = null;
                    try
                    {
                        tcpClient = await Server.AcceptTcpClientAsync();
                    }
                    catch (ObjectDisposedException) { break; }

                    string[] addressArray = tcpClient.Client.RemoteEndPoint.ToString().Split(':');
                    Client client         = new Client(addressArray[0], int.Parse(addressArray[1]));
                    ClientToTCPMap.Add(client, tcpClient);

                    if (onConnectCallBack != null)
                    {
                        onConnectCallBack.Invoke(client);
                    }


                    Task clientTask = new Task(async(c) =>
                    {
                        Byte[] bytes;
                        while (true)
                        {
                            try
                            {
                                if (!TCPUtilities.IsConnected(tcpClient))
                                {
                                    throw new Exception("Client Disconnected");
                                }

                                NetworkStream ns = tcpClient.GetStream();

                                if (tcpClient.ReceiveBufferSize > 0)
                                {
                                    string receivedMessage = string.Empty;

                                    do
                                    {
                                        bytes = new byte[tcpClient.ReceiveBufferSize];
                                        ns.Read(bytes, 0, tcpClient.ReceiveBufferSize);
                                        string msg       = Encoding.ASCII.GetString(bytes);
                                        receivedMessage += msg;
                                        await Task.Delay(1);
                                    }while (ns.DataAvailable);

                                    ReceivedMessage message = null;
                                    message = new ReceivedMessage((Client)c, receivedMessage);


                                    if (onReceiveCallback != null)
                                    {
                                        onReceiveCallback.Invoke(message);
                                    }
                                }
                            }
                            catch
                            {
                                ClientToTCPMap.Remove((Client)c);
                                if (onDisconnectCallBack != null)
                                {
                                    onDisconnectCallBack.Invoke((Client)c);
                                }
                                break;
                            }
                        }
                    }, client);
                    clientTask.Start();
                    clientTasks.Add(clientTask);
                }
            });

            listenConnection.Start();
        }