2013-09-24 4 views
2

У меня есть консольное приложение, которое будет работать по выходным. И когда я вернусь к работе, мне нужно будет благополучно ее прекратить.Безопасное выключение консольного приложения?

Он запускает цикл и изменяет файлы, перемещая их и обновляя базу данных.

Я не могу просто просто Ctrl-Z выйти из него Я предполагаю, что это может остановить программу в середине работы над файлом?

Есть ли безопасный способ для меня, чтобы сказать, нажмите клавишу «C», чтобы установить мой runLoopboolean в false так что это будет выйти из моего цикла правильно или есть способ лучше?

static void Main(string[] args) 
{ 
    bool runLoop = true; 

    while (runLoop) 
    { 
      // bunch of code 
      // moving files, updating database. 
    } 
} 

Что такое безопасный способ прервать этот цикл и убедиться, что текущий файл будет успешно завершен?

ответ

4

Вы можете легко добавить обработчик события открытой для вас, когда нажата эта команда и использовать его для сигнала отмены:

bool runLoop = true; 

ManualResetEvent allDoneEvent = new ManualResetEvent(false); 
Console.CancelKeyPress += (s, e) => 
{ 
    runLoop = false; 
    allDoneEvent.WaitOne(); 
}; 

int i = 0; 
while (runLoop) 
{ 
    Console.WriteLine(i++); 
    Thread.Sleep(1000); //placeholder for real work 
} 

//for debugging purposes only 
Console.WriteLine(); 
Console.WriteLine("press any key to exit . . ."); 
Console.ReadKey(true); 

allDoneEvent.Set(); 

Обратите внимание, что весь процесс будет убит, когда заканчивается этот обработчик события, поэтому вам также необходимо убедиться, что этот обработчик событий работает до тех пор, пока остальная часть программы не сможет закончить изящно.

+0

Я добавил это, выполнил мою программу и нажал Ctrl-C. Это оставило консольное окно открытым, оно остановило запуск программы, но я не уверен, где она остановилась. Мне нужно было сыграть в игру, чтобы продолжить программу или остановиться. Он не действовал так, как если runLoop был ложным, потому что у меня есть распечатка подсчетов, когда это происходит. Есть ли что-то еще, что я могу потерять? –

+0

@JamesWilson Правильно, он убьет процесс, когда обработчик этого события завершится; вам необходимо убедиться, что этот обработчик событий переживает остальную часть процесса. – Servy

+0

@jgauffin побег ничего не сделал. И я использовал этот сайт в качестве ссылки для нажатия Ctrl-C. http://msdn.microsoft.com/en-us/library/system.console.cancelkeypress.aspx –

Смежные вопросы