Как сохранить консоль открытой, пока не будет запущено событие CancelKeyPress?

Каков наилучший способ сохранить консольное приложение открытым до тех пор, пока событие CancelKeyPress не было запущено?

Я бы предпочел не использовать Console.Read или Console.ReadLine, так как я не хочу принимать ввод. Я просто хочу разрешить базовому приложению печатать информацию о событиях консоли по мере их запуска. Затем, когда событие CancelKeyPress запущено, я хочу изящно закрыть приложение.

5 ответов

Решение

Я предполагаю, что "изящное завершение работы приложения" - это та часть, с которой вы боретесь здесь. В противном случае ваше приложение автоматически выйдет из ctrl-c. Вы должны изменить название.

Вот краткая демонстрация того, что, я думаю, вам нужно. Это может быть улучшено с использованием блокировок и мониторов для уведомления. Я не уверен точно, что вам нужно, поэтому я просто поставлю это...

class Program
{

    private static volatile bool _s_stop = false;

    public static void Main(string[] args)
    {
        Console.CancelKeyPress += new ConsoleCancelEventHandler(Console_CancelKeyPress);
        while (!_s_stop)
        {
            /* put real logic here */
            Console.WriteLine("still running at {0}", DateTime.Now);
            Thread.Sleep(3000);
        }
        Console.WriteLine("Graceful shut down code here...");

        //don't leave this...  demonstration purposes only...
        Console.ReadLine();
    }

    static void Console_CancelKeyPress(object sender, ConsoleCancelEventArgs e)
    {
        //you have 2 options here, leave e.Cancel set to false and just handle any
        //graceful shutdown that you can while in here, or set a flag to notify the other
        //thread at the next check that it's to shut down.  I'll do the 2nd option
        e.Cancel = true;
        _s_stop = true;
        Console.WriteLine("CancelKeyPress fired...");
    }

}

Логическое значение _s_stop должно быть объявлено как volatile, иначе чрезмерно амбициозный оптимизатор может вызвать бесконечный цикл программы.

_s_stop логическое значение должно быть объявлено как volatile в примере кода, или чрезмерно амбициозный оптимизатор может вызвать бесконечный цикл программы.

Уже есть обработчик, привязанный к CancelKeyPress, который завершает ваше приложение, единственная причина, чтобы подключиться к нему - это если вы хотите перехватить событие и предотвратить закрытие приложения.

В вашей ситуации просто поместите ваше приложение в бесконечный цикл и позвольте встроенному обработчику событий убить его. Вы можете захотеть использовать что-то вроде Wait(1) или фоновый процесс, чтобы не использовать тонны процессора, ничего не делая.

Это может быть то, что вы ищете:

http://msdn.microsoft.com/en-us/library/system.console.cancelkeypress.aspx

Просто запустите вашу программу или коды без отладки, на клавиатуре нажмите CTRL + F5 вместо F5(отладка).

Другие вопросы по тегам