Я не знаю, как правильно закрыть TcpListener, когда асинхронный метод ожидает входящих соединений. Я нашел этот код на SO, здесь код:TcpListener: как прекратить прослушивание при ожидании 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)
{
// ...
}
}
И главная:
static void Main(string[] args)
{
var server = new Server();
server.StartListening();
Thread.Sleep(5000);
server.StopListening();
Console.Read();
}
Исключение бросили на этой линии
await AcceptConnections();
, когда я называю Server.StopListening(), объект удаляется.
Так что мой вопрос в том, как я могу отменить AcceptTcpClientAsync() для правильного закрытия TcpListener.
нашел ответ на SO: [http://stackoverflow.com/questions/14524209/what-is-the-correct-way-to-cancel-an-async-operation-that-doesnt-accept-a- Cance] [1] [1]: http://stackoverflow.com/questions/14524209/what-is-the-correct-way-to-cancel-an-async-operation-that-doesnt -accept-a-cance Thanks – Baptiste
Почему вы не используете try {}, чтобы поймать исключение? –