4

コンソールアプリでCtrl+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;
    }

ここここで質問を確認しましたが、何らかの理由でControl + Cを押すと、Visual Studio 2010がデバッガーのハンドラーに入らず、「ソースコードが利用できません」画面が表示されます。デバッグを継続する機会があり、それだけです。なぜ私がハンドラーに入らないのか誰かが知っていますか?単純なものが欠けていると確信しています。

4

3 に答える 3

4

どうやら、接続ページからの回避策にはバグがあります:

それまでの間、この問題を回避するために、混合モードのデバッグを有効にすることができます。次に、Ctrl-Cを押すと、最初のチャンスのCtrl-C例外を通知するダイアログがポップアップ表示されたら、[続行]をクリックします。次に、ハンドラーのブレークポイントに到達する必要があります。

于 2012-02-27T23:19:05.520 に答える
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;
        }
    }
}

お役に立てれば!

于 2012-02-27T23:27:42.320 に答える
0

Mainが終了すると、登録したイベントハンドラーConsole.CancelKeyPress += program.OnCancelKeyPressがガベージコレクションを取得します。次に、OSがデリゲートにアクセスしようとすると、実行するコードはありません。

静的デリゲートをスコープ外で実行するように宣言してから、OSがコールバックしようとしたときにスコープ内にとどまるように、静的デリゲートをMain割り当てる必要があります。Main

于 2012-02-28T00:07:39.267 に答える