Обработчик CancelKeyPress вводит в заблуждение оболочки (cmd.exe , powershell и bash)

#c# #.net-core #sigint

#c# #.net-ядро #sigint

Вопрос:

Давайте рассмотрим эту краткую демонстрацию:

 private static readonly CancellationTokenSource CancelSource = new CancellationTokenSource();

public static void Main()
{
    Console.WriteLine("Hello world!");
    Console.CancelKeyPress  = (s, e) =>
    {
        e.Cancel = true;
        CancelSource.Cancel();
        Console.WriteLine("CancelKeyPress event handler finished");
    };
    CancelSource.Token.WaitHandle.WaitOne();
    Task.Delay(1000).Wait();
    Console.WriteLine("Main finished");
}
  

Как вы можете видеть, программа ожидает события отмены, заявляя, что она не хочет, чтобы ее закрывали, ждет одну секунду, печатает «Основное завершено» и завершает работу.

Я бы ожидал, что результат будет:

 C:UsersBennisourcereposTestTest>dotnet run
Hello world!
CancelKeyPress event handler finished
^C
Main finished
C:UsersBennisourcereposTestTest>
  

Но это:

 C:UsersBennisourcereposTestTest>dotnet run
Hello world!
CancelKeyPress event handler finished
^C
C:UsersBennisourcereposTestTest>Main finished
  

К сожалению, оболочки (я тестировал bash, cmd.exe и powershell) распечатайте CWD (для следующей команды) до того, как программа фактически завершит выполнение! Я что-то упускаю? Обязательно ли мне использовать Console.TreatControlCAsInput , или это ошибка coreclr?

Комментарии:

1. Отлично работает на моем компьютере, Win10 и .NETCore v2.2.103. Может быть как-то связано со всеми процессами, подключенными к консоли, которые видят сигнал Ctrl C. Лучше всего сообщать об ошибке в github.com обязательно опишите все версии.

2. @HansPassant в какой оболочке вы запускали dotnet run? Это все еще работает, если вы увеличиваете задачу. Задержка? Я нахожусь на .NETCore версии 2.105, W10 1809, сборка 17763.379, если это имеет значение.

3. Я запустил его так, как вы показали. Одно заметное отличие, я не вижу эхо-сигнала ^ C. Итак, ваша консоль настроена иначе, чем моя, и она выглядит как cmd.exe получает указание прекратить ожидание слишком рано. Понятия не имею, какая конфигурация влияет на это, может быть, bash это испортил.

Ответ №1:

Это действительно проблема с dotnet cli:https://github.com/dotnet/cli/issues/11050