Использование события CancelKeyPress в консольном приложении .NET

Я написал консольное приложение .NET (на С#) для версии 4.5.1. Мой метод Main выглядит так:

public static void Main(string[] args)
{
    Console.CancelKeyPress += delegate
                              {
                                  CancelToken.Cancel();
                              };

    var kbTask = Task.Run(async () =>
                                {
                                    while (true)
                                    {
                                        await ProcessCommand(Console.ReadLine());
                                    }
                                }, CancelToken.Token);

    kbTask.Wait(CancelToken.Token);
}

Одна из возможных команд (обрабатывается ProcessCommand) вызывает длительный процесс, который я хотел бы отменить с помощью CTRL + C через делегат Console.CancelKeyPress.

Но когда я делаю это, Visual Studio открывает вкладку с надписью «mscorlib.dll не загружена», а затем ничего не делает — консоль остается открытой, но не отвечает.

Я также пытался запустить приложение вне отладки, но не могу найти исполняемый файл.


comment
Вам нужно проверить состояние токена отмены в цикле while после разрыва, когда он установлен.   -  person Sean    schedule 26.04.2016
comment
Хрустальный шар говорит, что вы используете Avast. Удалите его как можно скорее.   -  person Hans Passant    schedule 26.04.2016
comment
@HansPassant Ваш хрустальный шар неправильный. Никакой AV не установлен, кроме стандартного Защитника Windows.   -  person awj    schedule 26.04.2016
comment
@Sean Длительный процесс проходит через цикл foreach, и в конце каждого прохода я проверяю CancellationToken (который является глобальным).   -  person awj    schedule 26.04.2016


Ответы (1)


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

Инструменты компилятора Microsoft создают символы в отдельных файлах с расширением .pdb (программная база данных). Это позволяет им создавать отдельные символы для выпуска двоичных файлов. С сервером символов ваша среда IDE может получить файл символов, соответствующий конкретной версии DLL, во время отладки. Вы также можете настроить эту систему для своих собственных двоичных файлов продукта, что может быть очень полезно для пост-мортемной отладки любых сбоев на машинах конечных пользователей.

См. документацию Microsoft. для получения более подробной информации об использовании их общедоступных символов.

person BilalAhmed    schedule 26.04.2016
comment
Сделав это, я вижу, что символы загружаются динамически, но теперь, когда я нажимаю CTRL + C, Visual Studio открывает вкладку с надписью «Источник недоступен», и снова консоль не отвечает. - person awj; 26.04.2016
comment
Ошибка «Источник недоступен» возникает, когда приложение пытается прочитать неуправляемый код. Позвольте мне разобраться с этим для вас. - person BilalAhmed; 26.04.2016