11.11. Create a Multithreaded TCP Server That Supports Asynchronous Communications
You need to handle multiple network requests concurrently or perform a network data transfer as a background task while your program continues with other processing.
Use the AcceptTcpClient method of the System.Net.Sockets.TcpListener class to accept connections. Every time a new client connects, start a new thread to handle the connection. Alternatively, use the TcpListener.BeginAcceptTcpClient to accept a new client connection on a thread-pool thread using the asynchronous execution pattern (discussed in recipe 4-2).
To start a background task to handle the asynchronous sending of data, you can use the BeginWrite method of the System.Net.Sockets.NetworkStream ...