Как сохранить консоль открытой, пока не будет запущено событие 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(отладка).