2013-09-24 107 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 –

相關問題