2013-09-24 58 views
2

我有一个将在周末运行的控制台应用程序。当我回来工作时,我需要安全地终止它。安全地退出控制台应用程序?

它正在运行一个循环并通过移动它们并更新数据库来修改文件。

我不能只是简单的Ctrl-Z退出它我假设,因为这可能会停止在文件上工作的程序?

有没有一个安全的办法,我说按“C”键来设定我的runLoopbooleanfalse所以这将正确地退出我的循环,或是否有更好的办法?

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 –

相关问题