Я начал изучать программирование сокетов в последнее время и написал простой async tcp-сервер, который может отправлять полученные от отдельных клиентов только штрафы. здесь упрощенный код для него:как сетевой поток обнаруживает разъединение
//accpet loop
while (true)
{
var client = await listener.AcceptTcpClientAsync();
new AppClient(client).Start();
}
// and here is the start method in AppClient class
public async void Start()
{
/// TcpClient is a class property which is in scope of this method
using (var stream = TcpClient.GetStream())
{
string message = string.Empty;
byte[] buffer = new byte[1000];
int bytesRead = 0;
while (true)
{
try
{
bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length).ConfigureAwait(false);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
break;
}
// decode simple text message
message += Encoding.UTF8.GetString(buffer, 0, bytesRead);
}
}
}
он обрабатывает тысячи связи в однотридовой моде, но , что заставляет меня расстроился, что независимо от того, как я уничтожить клиент (процесс убийства и ...) Метод ReadAsync немедленно вызывает исключение, которое в основном противоречит моим мыслям. (насколько я уверен, что обнаружение разъединенного разъема в tcp не должно быть таким простым)
Я делаю что-то неправильно?
Вы действительно не должны делать 'catch (Exception ex)' - это такой анти-шаблон. – Enigmativity
Спасибо, я запомню это. – SHM
Для того, что он делает, нет ничего плохого в catching Exception –