Обложка канала

.NET Разработчик

Опытный разработчик не так давно зашёл в .Net и поставил цель получить сертификат Microsoft. Свой ежедневный прогресс он описывает на канале .Net Разработчик. Заметки об изученном материале, советы по повышению производительности и поддержке мотивации, ин

.NET Разработчик

3 года назад
Открыть в
День 1523. #ЗаметкиНаПолях Обработка CancelKeyPress с Помощью CancellationToken Иногда нужно определить, когда консольное приложение закрывается, чтобы выполнить некоторую очистку. Console.CancelKeyPress позволяет зарегистрировать метод обратного вызова, который выполнится при нажатии Ctrl+C или Ctrl+Break в консоли. Это событие также позволяет предотвратить закрытие приложения, чтобы вы могли выполнить очистку перед завершением работы. Можно использовать Console.CancelKeyPress в паре с CancellationToken для отмены текущих асинхронных операций. Метод, выполнение которого прерывается:
static async Task DoAsync (
 string[] args, CancellationToken ct)
{
  try
  {
    Console.WriteLine("Ожидание…");
    await Task.Delay(10_000, ct);
  }
  catch (OperationCanceledException)
  {
    Console.WriteLine("Операция отменена");
  }
}

Основной текст программы:
using var cts = new CancellationTokenSource();
Console.CancelKeyPress += (sender, e) =>
{
  // Мы остановим процесс вручную
  // с помощью токена отмены
  e.Cancel = true;
  
  // … очистка …

  // Вызываем отмену на токене
  cts.Cancel();
};

await DoAsync(args, cts.Token);

Кроме того, у токена отмены есть метод Register, позволяющий зарегистрировать методы обратного вызова, которые выполнятся в случае отмены токена:
cts.Token.Register(
 () => Console.WriteLine("Отмена…"));

Источник: https://www.meziantou.net/handling-cancelkeypress-using-a-cancellationtoken.htm