Non so come chiudere correttamente un TcpListener mentre un metodo asincrono attende le connessioni in entrata. Ho trovato questo codice su SO, qui il codice:TcpListener: come interrompere l'ascolto durante l'attesa AcceptTcpClientAsync()
public class Server
{
private TcpListener _Server;
private bool _Active;
public Server()
{
_Server = new TcpListener(IPAddress.Any, 5555);
}
public async void StartListening()
{
_Active = true;
_Server.Start();
await AcceptConnections();
}
public void StopListening()
{
_Active = false;
_Server.Stop();
}
private async Task AcceptConnections()
{
while (_Active)
{
var client = await _Server.AcceptTcpClientAsync();
DoStuffWithClient(client);
}
}
private void DoStuffWithClient(TcpClient client)
{
// ...
}
}
e le principali:
static void Main(string[] args)
{
var server = new Server();
server.StartListening();
Thread.Sleep(5000);
server.StopListening();
Console.Read();
}
Un'eccezione è gettato su questa linea
await AcceptConnections();
quando chiamo Server.StopListening(), l'oggetto è cancellato.
Quindi la mia domanda è, come posso annullare AcceptTcpClientAsync() per chiudere correttamente TcpListener.
ha trovato una risposta su SO: [http://stackoverflow.com/questions/14524209/what-is-the-correct-way-to-cancel-an-async-operation-that-doesnt-accept-a- cato] [1] [1]: http://stackoverflow.com/questions/14524209/what-is-the-correct-way-to-cancel-an-async-operation-that-doesnt -accept-a-cance Grazie – Baptiste
Perché non si usa un try {} per catturare l'eccezione? –