Я использую AcceptTcpClient()
в цикле while(!Disposing)
, чтобы принимать своих клиентов.
Когда я располагаю Class, я вызываю функцию Stop()
TcpListener
и устанавливаю Disposing
в true; как это:
public class Server : IDisposable
{
private TcpListener _tcpListener;
private bool _isDisposing;
public void Start()
{
(new Thread(new ThreadStart(ListenForClients))).Start();
}
private void ListenForClients()
{
this._tcpListener = new TcpListener(System.Net.IPAddress.Any, this.ListenPort);
this._tcpListener.Start();
while (!_isDisposing)
{
//blocks until a client has connected to the server
TcpClient client = this._tcpListener.AcceptTcpClient();
if (client == null) continue;
//create a thread to handle communication with connected client
}
}
public void Dispose()
{
this._isDisposing = true;
this._tcpListener.Stop();
}
}
Обратите внимание, что это всего лишь небольшая выдержка из серверного класса ...
Таким образом, программа может оставаться заблокированной для функции AcceptTcpClient()
и по-прежнему завершаться.
Однако само прослушивание также должно происходить в отдельном Thread (Start() function)
.