Предположим, у меня есть консольное приложение, которое постоянно выводит текущее время:
Код: Выделить всё
while (true)
{
var now = DateTime.Now;
Console.Write(now);
Console.Write(" ");
Console.Write(now.Millisecond);
Console.CursorLeft = 0; // Overwrite the same line
}
Код: Выделить всё
23/02/2023 23:07:14 658
Код: Выделить всё
23/02/2023 23:09:56 441
Goodbye!
Код: Выделить всё
Console.CancelKeyPress += OnCancel;
while (true)
{
var now = DateTime.Now;
Console.Write(now);
Console.Write(" ");
Console.Write(now.Millisecond);
Console.CursorLeft = 0; // Overwrite the same line
}
void OnCancel(object? sender, ConsoleCancelEventArgs e)
{
Console.WriteLine("Goodbye");
}
Код: Выделить всё
Goodbye023 23:14:55 670
23/02/2023 23:14:55
Я пробовал разные подходы и не буду перечислять код для них, но вкратце все перечисленное ниже я пробовал безрезультатно:
- Определил логическую переменную cancelRequested в верхней области видимости и установил условие цикла while
!cancelRequested; В OnCancel установите для переменной значение true;после цикла. Это блокируетКод: Выделить всё
Console.WriteLine("Goodbye!")(тупик?).Код: Выделить всё
Console.WriteLine("Goodbye!") - Аналогично приведенному выше, но используется CancellationTokenSource вместо логической переменной.
Наблюдается такое же поведение взаимоблокировки, так что я думаю, это эквивалентно?
Подробнее здесь: https://stackoverflow.com/questions/755 ... upon-ctrlc
Мобильная версия