I've created a multi-threaded TcpListener to receive request from clients.

I created a background worker to handle the endless loop that checks if there is a new connection.
Code:
bw.WorkerSupportsCancellation = true;
                bw.WorkerReportsProgress = true;
                bw.DoWork += new DoWorkEventHandler(bw_start);

                if (!bw.IsBusy)
                    bw.RunWorkerAsync();
This is the bw_start:
Code:
private void bw_start(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker worker = sender as BackgroundWorker;
            
            TcpClient clientSocket = default(TcpClient);
            tListener.Start();

            int counter = 0;
            
            counter = 0;
            while (true)
            {
                counter += 1;
                clientSocket = tListener.AcceptTcpClient();
                HandleClient client = new HandleClient();
                client.startClient(clientSocket, Convert.ToString(counter));
            }

            clientSocket.Close();
            tListener.Stop();
        }
HandleClient Methods:
Code:
public void startClient(TcpClient inClientSocket, string clineNo)
        {
            this.clientSocket = inClientSocket;
            this.clNo = clineNo;
            
            ThreadPool.QueueUserWorkItem(new WaitCallback(doTransact));            
        }
Code:
private void doTransact(object state)
        {
//some declarations here

while (True)
            {
try
                {
                    if (clientSocket.Connected)
                    {

recv = networkStream.Read(bytesFrom, 0, (int)clientSocket.ReceiveBufferSize); //this part receives an error that is realted about threading
//some processing here

//send response

}
else
{
break;
}
}
else
{
break;
}
}
}