Escが押されるまでコードを実行しようとしています。したがってReadKey
、コンソールで使用しています
var input = Console.ReadKey();
do
{
} while (input.Key != ConsoleKey.Escape);
しかし、「ConsoleKey」では、「bool」では ConsoleKey を使用できないと書かれています。どうすれば修正できますか?または、代わりに何を使用しますか?
Escが押されるまでコードを実行しようとしています。したがってReadKey
、コンソールで使用しています
var input = Console.ReadKey();
do
{
} while (input.Key != ConsoleKey.Escape);
しかし、「ConsoleKey」では、「bool」では ConsoleKey を使用できないと書かれています。どうすれば修正できますか?または、代わりに何を使用しますか?
これを試して:
ConsoleKeyInfo input;
do
{
input = Console.ReadKey();
} while (input.Key != ConsoleKey.Escape);
従来の+ESCの代わりにキーを使用したい特別な理由はありますか?CTRLC
後者のイベントにフックすることができConsole.CancelKeyPress
ます。これは、コマンドライン インターフェイスの世界では標準です。
Console.ReadKey()
これは、一部のループで問題になる可能性があります。この例を見てみましょう:
using System.Threading;
using System.Threading.Tasks;
CancellationTokenSource cts;
public void Run()
{
cts = new CancellationTokenSource();
var task = new Task(DoSomething, cts.Token);
task.Start();
while (!task.IsCompleted)
{
var keyInput = Console.ReadKey(true);
if (keyInput.Key == ConsoleKey.Escape)
{
Console.WriteLine("Escape was pressed, cancelling...");
cts.Cancel();
}
}
Console.WriteLine("Done.");
}
void DoSomething()
{
var count = 0;
while (!cts.IsCancellationRequested)
{
Thread.Sleep(1000);
count++;
Console.WriteLine("Background task has ticked ({0}).", count.ToString());
}
}
これは、が押されるTask
のを待っている間、 を使用してバックグラウンド作業を行います。キャンセルは問題なく機能しますが、完了後にもう一度ESCスタックします(キャンセル)。Console.ReadKey()
などの Win32 API を使用してGetKeyboardState
、代わりにキー コードを確認できます。これはブロックされていないためです。ただし、CancelKeyPress
代わりにイベントを使用することをお勧めします ( CTRL+ C):
void Console_CancelKeyPress(object sender, ConsoleCancelEventArgs e)
{
Console.WriteLine("Cancelling...");
cts.Cancel();
e.Cancel = true; // Do not terminate immediately!
}
ConsoleKeyInfo input;
do
{
input = Console.ReadKey();
} while (input.Key != ConsoleKey.Escape);
またはそれより短い
while (Console.ReadKey().Key != ConsoleKey.Escape){}