我如何继续运行我的控制台应用程序,直到一个键按下(如Esc按下?)

我假设它环绕着一个while循环。我不喜欢ReadKey,因为它阻塞操作并要求一个键,而不是只是继续听按键。

如何做到这一点呢?


当前回答

根据我的经验,在控制台应用中,读取最后按下的键的最简单方法如下(以箭头键为例):

ConsoleKey readKey = Console.ReadKey ().Key;
if (readKey == ConsoleKey.LeftArrow) {
    <Method1> ();  //Do something
} else if (readKey == ConsoleKey.RightArrow) {
    <Method2> ();  //Do something
}

我用来避免循环,而不是我在一个方法中写上面的代码,我在“Method1”和“Method2”的末尾调用它,所以,在执行“Method1”或“Method2”后,Console.ReadKey()。键已准备好再次读取键。

其他回答

使用以下代码,您可以在控制台执行过程中监听空格键,并暂停,直到按下另一个键,并选择监听Escape键,以打破主循环。

static ConsoleKeyInfo cki = new ConsoleKeyInfo();

while(true) {
      if (WaitOrBreak()) break;
      //your main code
}

private static bool WaitOrBreak(){
    if (Console.KeyAvailable) cki = Console.ReadKey(true);
    if (cki.Key == ConsoleKey.Spacebar)
    {
        Console.Write("waiting..");
        while (Console.KeyAvailable == false)
        {
            Thread.Sleep(250);Console.Write(".");
        }
        Console.WriteLine();
        Console.ReadKey(true);
        cki = new ConsoleKeyInfo();
    }
    if (cki.Key == ConsoleKey.Escape) return true;
    return false;
}

根据我的经验,在控制台应用中,读取最后按下的键的最简单方法如下(以箭头键为例):

ConsoleKey readKey = Console.ReadKey ().Key;
if (readKey == ConsoleKey.LeftArrow) {
    <Method1> ();  //Do something
} else if (readKey == ConsoleKey.RightArrow) {
    <Method2> ();  //Do something
}

我用来避免循环,而不是我在一个方法中写上面的代码,我在“Method1”和“Method2”的末尾调用它,所以,在执行“Method1”或“Method2”后,Console.ReadKey()。键已准备好再次读取键。

使用控制台。只有当你知道ReadKey不会被阻塞时,你才会调用ReadKey:

Console.WriteLine("Press ESC to stop");
do {
    while (! Console.KeyAvailable) {
        // Do something
   }       
} while (Console.ReadKey(true).Key != ConsoleKey.Escape);
Console.WriteLine("Hello");
var key = Console.ReadKey(); 
DateTime start = DateTime.Now;
bool gotKey = Console.KeyAvailable;

while ((DateTime.Now - start).TotalSeconds < 2)                
{
    if (key.Key == ConsoleKey.Escape)
    {
       Environment.Exit(0);
    } 
    else if (key.Key == ConsoleKey.Enter)
    {
       break;
    } 

你可以稍微改变一下你的方法——使用Console.ReadKey()来停止你的应用程序,但在后台线程中完成你的工作:

static void Main(string[] args)
{
    var myWorker = new MyWorker();
    myWorker.DoStuff();
    Console.WriteLine("Press any key to stop...");
    Console.ReadKey();
}

在myWorker.DoStuff()函数中,您可以在后台线程上调用另一个函数(使用Action<>()或Func<>()是一种简单的方法),然后立即返回。