fix console output on Exit server
This commit is contained in:
@@ -50,26 +50,40 @@ namespace f_srv
|
|||||||
// Запускаем сервер в отдельной задаче
|
// Запускаем сервер в отдельной задаче
|
||||||
var serverTask = Task.Run(() => StartServer(ip, port, _cancellationTokenSource.Token));
|
var serverTask = Task.Run(() => StartServer(ip, port, _cancellationTokenSource.Token));
|
||||||
|
|
||||||
// Ожидаем нажатие клавиши
|
// Ожидаем нажатие клавиши с явной обработкой
|
||||||
Console.WriteLine("Сервер запущен. Нажмите любую клавишу для остановки...");
|
Console.WriteLine("Сервер запущен. Нажмите любую клавишу для остановки...");
|
||||||
ConsoleKeyInfo ki = Console.ReadKey();
|
|
||||||
|
|
||||||
|
// Ждем нажатия клавиши в отдельном потоке
|
||||||
|
var keyTask = Task.Run(() =>
|
||||||
|
{
|
||||||
|
Console.ReadKey(true); // true - не отображать нажатую клавишу
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
|
||||||
|
// Ожидаем либо нажатия клавиши, либо завершения сервера
|
||||||
|
await Task.WhenAny(serverTask, keyTask);
|
||||||
|
|
||||||
|
if (!_cancellationTokenSource.IsCancellationRequested)
|
||||||
|
{
|
||||||
// Отправляем сигнал отмены
|
// Отправляем сигнал отмены
|
||||||
_cancellationTokenSource.Cancel();
|
_cancellationTokenSource.Cancel();
|
||||||
|
|
||||||
// Останавливаем listener
|
// Останавливаем listener
|
||||||
_listener?.Stop();
|
_listener?.Stop();
|
||||||
|
|
||||||
// Ждем завершения сервера
|
// Даем серверу время на корректное завершение
|
||||||
await serverTask;
|
try
|
||||||
|
|
||||||
if (Console.KeyAvailable)
|
|
||||||
{
|
{
|
||||||
ConsoleKeyInfo key = Console.ReadKey();
|
await Task.WhenAny(serverTask, Task.Delay(2000));
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
// Игнорируем исключения при завершении
|
||||||
|
}
|
||||||
|
|
||||||
|
Console.WriteLine("Сервер остановлен.");
|
||||||
}
|
}
|
||||||
|
|
||||||
Console.WriteLine(" \r\n ");
|
|
||||||
Console.WriteLine(" Сервер остановлен.");
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -113,6 +127,12 @@ namespace f_srv
|
|||||||
catch (OperationCanceledException)
|
catch (OperationCanceledException)
|
||||||
{
|
{
|
||||||
// Игнорируем отмену
|
// Игнорируем отмену
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
catch (ObjectDisposedException)
|
||||||
|
{
|
||||||
|
// Listener был остановлен
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
@@ -124,13 +144,23 @@ namespace f_srv
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
if (!cancellationToken.IsCancellationRequested)
|
||||||
{
|
{
|
||||||
Console.WriteLine($"Ошибка: {ex.Message}");
|
Console.WriteLine($"Ошибка: {ex.Message}");
|
||||||
}
|
}
|
||||||
|
}
|
||||||
finally
|
finally
|
||||||
|
{
|
||||||
|
try
|
||||||
{
|
{
|
||||||
_listener?.Stop();
|
_listener?.Stop();
|
||||||
}
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
// Игнорируем ошибки при остановке
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static async Task HandleClient(TcpClient client, CancellationToken cancellationToken)
|
static async Task HandleClient(TcpClient client, CancellationToken cancellationToken)
|
||||||
@@ -145,15 +175,12 @@ namespace f_srv
|
|||||||
using (var reader = new StreamReader(stream, Encoding.UTF8))
|
using (var reader = new StreamReader(stream, Encoding.UTF8))
|
||||||
using (var writer = new StreamWriter(stream, Encoding.UTF8) { AutoFlush = true })
|
using (var writer = new StreamWriter(stream, Encoding.UTF8) { AutoFlush = true })
|
||||||
{
|
{
|
||||||
var buffer = new StringBuilder();
|
|
||||||
var charBuffer = new char[1024];
|
|
||||||
|
|
||||||
while (!cancellationToken.IsCancellationRequested)
|
while (!cancellationToken.IsCancellationRequested)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
// Чтение строки (до символа новой строки)
|
// Чтение строки (до символа новой строки)
|
||||||
var line = await reader.ReadLineAsync(cancellationToken);
|
var line = await reader.ReadLineAsync();
|
||||||
|
|
||||||
if (line == null)
|
if (line == null)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user