新しい着信クライアントを非同期的に継続的に監視し、それらをクライアントリストに追加するTCPサーバーがあります。
public class TcpServer
{
public List<TcpClient> ClientsList = new List<TcpClient>();
protected TcpListener Server = new TcpListener(IPAddress.Any, 3000);
private _isMonitoring = false;
public TcpServer()
{
Server.Start();
Server.StartMonitoring();
}
public void StartMonitoring()
{
_isMonitoring = true;
Server.BeginAcceptTcpClient(HandleNewClient, null);
}
public void StopMonitoring()
{
_isMonitoring = false;
}
protected void HandleNewClient(IAsyncResult result)
{
if (_isMonitoring)
{
var client = Server.EndAcceptTcpClient(result);
ClientsList.Add(client);
StartMonitoring(); // repeats the monitoring
}
}
}
ただし、このコードには2つの問題があります。
1つ目はのStartMonitoring()
呼び出しですHandleNewClient()
。これがないと、サーバーは1つの着信接続のみを受け入れ、追加の接続を無視します。私がやりたいのは、新しいクライアントを継続的に監視することですが、現在のやり方について何かが間違っています。これを行うためのより良い方法はありますか?
2番目は_isMonitoring
旗です。非同期コールバックのアクティブ化を停止し、ループを停止する他の方法がわかりません。これをどのように改善できるかについてのアドバイスはありますか?while (true)
非同期コールバックの使用に固執し、ループを含むメソッドを実行する新しいスレッドを手動で作成する必要をなくしたいと思います。