我想不断等待在我的控制台应用程序中按下一个组合键,但我正在进行的方式似乎在进程运行时使用了大量的CPU。
对于这样一个基本任务,感觉应该有更好的方法来做到这一点,但我不确定那是什么,我用dotTrace描述了我的应用程序,发现唯一的热点是下面的代码。< / p>
while (true)
{
if (!Console.KeyAvailable)
{
continue;
}
var input = Console.ReadKey(true);
if (input.Modifiers != ConsoleModifiers.Control)
{
continue;
}
if (input.Key == ConsoleKey.S)
{
Server?.Dispose();
}
}
答案 0 :(得分:3)
如果您可以使用标准Ctrl + C退出而不是Ctrl + S,则可以使用简单的ReadKey
。并确保设置TreatControlCAsInput
,然后应用程序将被杀死。
static void Main(string[] args)
{
// important!!!
Console.TreatControlCAsInput = true;
while (true)
{
Console.WriteLine("Use CTRL+C to exit");
var input = Console.ReadKey();
if (input.Key == ConsoleKey.C && input.Modifiers == ConsoleModifiers.Control)
{
break;
}
}
// Cleanup
// Server?.Dispose();
}
答案 1 :(得分:2)
不是在循环中观察,而是每次按下按键时都使用按键事件进行检查。
这意味着您只需为每次按键检查一次。
修改强> 我错过了控制台应用程序部分,但您可以阅读这样的行:
来自:https://www.dotnetperls.com/console-readline
using System;
class Program
{
static void Main()
{
while (true) // Loop indefinitely
{
Console.WriteLine("Enter input:"); // Prompt
string line = Console.ReadLine(); // Get string from user
if (line == "exit") // Check string
{
break;
}
Console.Write("You typed "); // Report output
Console.Write(line.Length);
Console.WriteLine(" character(s)");
}
}
}
答案 2 :(得分:1)
不需要繁忙的等待。 Console.ReadKey()
将阻止,直到有可用的按键,基本上没有CPU使用率。因此,您不需要一遍又一遍地检查Console.KeyAvailable
。
while (true)
{
// DO NOT INTERCEPT KEY PRESSES!
//IF CTRL+S IS FORWARDED TO THE CONSOLE APP, WEIRD THINGS WILL HAPPEN.
var input = Console.ReadKey(false);
if (input.Modifiers != ConsoleModifiers.Control)
{
continue;
}
if (input.Key == ConsoleKey.S)
{
Server?.Dispose();
}
}
答案 3 :(得分:0)
我认为你应该使用Thread.Sleep
while (true)
{
Thread.Sleep(100);
if (!Console.KeyAvailable)
{
continue;
}
var input = Console.ReadKey(true);
if (input.Modifiers != ConsoleModifiers.Control)
{
continue;
}
if (input.Key == ConsoleKey.S)
{
Server?.Dispose();
}
}
答案 4 :(得分:0)
您只需要在完成Main(string [] args)
之前就需要这样做。private static void Main(string[] args)
{
//call method for daemon before while
while (true)
{
Thread.Sleep(1000);
}
}