Для реализации отправки сообщения на сервер при завершении работы консольного приложения, вам нужно перехватить события завершения процесса. В C# это можно сделать с помощью обработчика событий.
Вот пример, как вы можете это сделать:
1. Используйте `Console.CancelKeyPress` для перехвата событий закрытия консольного приложения, таких как нажатие `Ctrl+C`.
2. Используйте `AppDomain.CurrentDomain.ProcessExit` для обработки события выхода из приложения.
3. Для сложного завершения (например, через диспетчер задач) нет прямого способа отследить это, но можно обработать другие случаи.
Вот пример кода:
```csharp
using System;
using System.Net.Http;
using System.Threading.Tasks;
class Program
{
private static readonly HttpClient client = new HttpClient();
static async Task Main(string[] args)
{
// Подписываемся на события завершения приложения
Console.CancelKeyPress += new ConsoleCancelEventHandler(OnExit);
AppDomain.CurrentDomain.ProcessExit += new EventHandler(OnExit);
Console.WriteLine("Приложение запущено. Нажмите Ctrl+C для выхода...");
// Ваш основной код приложения здесь
while (true)
{
// Например, бесконечный цикл
await Task.Delay(1000);
}
}
private static async void OnExit(object sender, EventArgs e)
{
// Здесь отправим сообщение на сервер о завершении работы
await SendDisconnectMessage();
}
private static async Task SendDisconnectMessage()
{
try
{
var response = await client.PostAsync("https://example.com/api/disconnect", null);
if (response.IsSuccessStatusCode)
{
Console.WriteLine("Сообщение о завершении работы отправлено успешно.");
}
else
{
Console.WriteLine("Ошибка при отправке сообщения: " + response.StatusCode);
}
}
catch (Exception ex)
{
Console.WriteLine("Произошла ошибка: " + ex.Message);
}
}
}
```
### Пояснения:
- **Console.CancelKeyPress**: Этот обработчик срабатывает, когда пользователь нажимает `Ctrl+C` или закрывает консольное приложение, используя специальное поведение.
- **AppDomain.CurrentDomain.ProcessExit**: Этот обработчик вызывается, когда процесс завершается. Однако, имейте в виду, что `AppDomain.CurrentDomain.ProcessExit` может не сработать в случае жесткого завершения приложения (например, через диспетчер задач).
- **SendDisconnectMessage**: Метод, который отправляет сообщение на сервер.
Учтите, что ваш сервер должен поддерживать обработку POST-запросов на указанном URL. Не забудьте добавить соответствующую обработку ошибок и, по возможности, протестировать в разных сценариях завершения работы вашего приложения.