2008-10-14 45 views
8

只要CancelKeyPress事件未被觸發,保持控制檯應用程序打開的最佳方式是什麼?如何在啓動CancelKeyPress事件之前保持控制檯處於打開狀態?

我寧願不使用Console.Read或Console.ReadLine,因爲我不想接受輸入。我只想讓底層應用程序在觸發時將其打印到控制檯事件詳細信息中。然後,一旦CancelKeyPress事件被觸發,我想正常關閉應用程序。

+0

我假設「優雅地關閉應用程序」是您在這裏掙扎的部分。否則,你的應用程序會自動退出ctrl-c。你應該改變標題。 – TheSoftwareJedi 2008-10-15 00:11:19

+1

不,我遇到的問題是「只要CancelKeyPress事件未被解僱就保持控制檯應用程序打開的最佳方式」作爲問題狀態:) – 2008-10-15 04:25:36

回答

10

我假設「正常關閉應用程序」是你在這裏奮鬥的一部分。否則,你的應用程序會自動退出ctrl-c。你應該改變標題。

下面是我認爲你需要的一個快速演示。可以通過使用鎖定和監視器進行通知來進一步細化。我不知道你需要什麼了,所以我就提出這個...

class Program 
{ 

    private static 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..."); 
    } 

} 
+0

我更期待什麼是保持最佳方式打開一個控制檯而不詢問輸入。我處理CancelKeyPress事件以正常關閉。 Thread.Sleep似乎是最好的方式來做到這一點。 – 2008-10-15 00:53:17

1

已經有一個綁定到CancelKeyPress的處理程序終止你的應用程序,掛鉤它的唯一原因是如果你想攔截事件並阻止應用程序關閉。

在您的情況下,只需將您的應用放入無限循環,並讓內置事件處理程序將其殺死。您可能需要考慮使用諸如Wait(1)或後臺進程之類的東西來防止它在無所事事的情況下使用大量的CPU。

3

_s_stop布爾應聲明示例代碼揮發,或過於雄心勃勃的優化可能會導致程序無限循環。

1

簡單地運行你的程序或代碼而不用調試,在你的鍵盤上鍵入CTRL + f5而不是F5(調試)。

相關問題