#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