控制台应用程序中CPU使用率高

时间:2018-01-23 11:56:23

标签: c# .net visual-studio

我想不断等待在我的控制台应用程序中按下一个组合键,但我正在进行的方式似乎在进程运行时使用了大量的CPU。

对于这样一个基本任务,感觉应该有更好的方法来做到这一点,但我不确定那是什么,我用dotTrace描述了我的应用程序,发现唯一的热点是下面的代码。< / p>

enter image description here

while (true)
{
    if (!Console.KeyAvailable)
    {
        continue;
    }

    var input = Console.ReadKey(true);

    if (input.Modifiers != ConsoleModifiers.Control)
    {
        continue;
    }

    if (input.Key == ConsoleKey.S)
    {
        Server?.Dispose();
    }
}

5 个答案:

答案 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);
     }
}