2012-02-27 180 views
4

我有下面的代碼,我試圖在一個控制檯應用程序使用捕獲按Ctrl + C:無法捕獲按Ctrl + C在C#控制檯應用程序

/// <summary> 
    /// A driver program for testing 
    /// </summary> 
    /// <param name="args">Arguments to the program</param> 
    static void Main(string[] args) 
    { 
     var program = new Program(); 

     Console.Clear(); 
     Console.TreatControlCAsInput = false; 
     Console.CancelKeyPress += program.OnCancelKeyPress; 

     program.Run(args.FirstOrDefault() ?? "3.26.200.125"); 

     Console.WriteLine("Press any key to continue ..."); 
     Console.ReadKey(); 
    } 

    /// <summary> 
    /// Called when [cancel key press]. 
    /// </summary> 
    /// <param name="sender">The sender.</param> 
    /// <param name="e">The <see cref="System.ConsoleCancelEventArgs"/> instance containing the event data.</param> 
    internal void OnCancelKeyPress(object sender, ConsoleCancelEventArgs e) 
    { 
     this.Continue = false; 
     e.Cancel = true; 
    } 

我已經檢查問題herehere,但由於某些原因,當我按下Control + C時,Visual Studio 2010將無法​​進入調試器中的處理程序,我只是得到一個「源代碼不可用」屏幕,並有機會繼續調試,就是這樣。有沒有人知道我爲什麼不進入處理程序?我相信我只是想念一些簡單的東西。

+0

這也是當我在調試時,當我在發佈中運行該程序時,它工作正常。這只是我遇到的一個視覺工作室問題? – 2012-02-27 23:23:51

+0

您是否嘗試過在控制處理程序中設置斷點?可能會導致Visual Studio在處理程序運行之前中斷執行。之後你可以看到是否繼續進入控制處理程序。 – Guvante 2012-02-27 23:24:04

+0

是的,我已經在處理程序中放置了一個斷點,它永遠不會被擊中。只要我在上述點擊F5繼續(希望進入我的處理程序),程序就會恢復運行,就像沒有發生任何事情,並且沒有中斷鍵被擊中。 – 2012-02-27 23:28:52

回答

4

顯然是有bugConnect頁面周圍的工作是:

同時,要解決這個問題,您可以啓用混合模式調試。然後,當您按Ctrl-C並彈出一個對話框,通知您第一次出現Ctrl-C異常時,請點擊「繼續」。你應該在你的處理程序中打斷點。

+0

你說得對。我啓用了混合模式調試,現在它進入處理程序。非常感謝你。 – 2012-02-28 16:05:56

1

下面的代碼對我來說

using System; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Console.Clear(); 
      Console.WriteLine("Press X to quit"); 
      Console.TreatControlCAsInput = false; 
      Console.CancelKeyPress += (s, ev) => 
              { 
               Console.WriteLine("Ctrl+C pressed"); 
               ev.Cancel = true; 
              }; 

      while (true) 
       if (Console.ReadKey().Key == ConsoleKey.X) 
        break; 
     } 
    } 
} 

希望這有助於偉大工程!

+0

壞主意! ReadKey()會阻止,並且不應該以任何典型的方式來這樣做。嘗試考慮使用CancellationToken,並將其放入其自己的線程/任務中,並使用它們之間的檢查指針和同步。 您也可以嘗試使用Console.KeyAvailable屬性進行輪詢。當它返回True時,ReadKey()不會被阻塞。 – Latency 2018-01-04 12:33:16

+0

是的,但重點不在於證明這一點。只是陷阱Ctrl + C。 另外:你甚至嘗試過嗎?作爲一個簡單的例子,它按預期工作。 – Ani 2018-01-04 22:13:45

+0

是的,我正在研究一些非常相似的東西,並在我們講話時進行測試。但是,由於我添加了異步的東西以使其無阻塞/取消等,我的情況更加複雜。 – Latency 2018-01-05 01:33:53

0

當Main退出時,您使用Console.CancelKeyPress += program.OnCancelKeyPress註冊的事件處理程序會被垃圾收集。然後,當操作系統試圖訪問代理時,沒有代碼需要運行。

您必須聲明要的Main範圍之外運行一個靜態的代表,然後內Main分配給它,使其保持在範圍內當OS試圖打電話回去吧。

+1

顯然不是這種情況,因爲處理程序在我沒有在Visual Studio中進行調試時運行良好。 – 2012-02-28 16:05:13

+0

你是對的。我提供的答案是在我通過Windows API調用註冊Ctrl-C處理程序而不是您上面顯示的方法的時候開始的。看起來你知道了,所以這是個好消息。 – Buddy 2012-02-28 17:46:44