来自while循环的高CPU使用率,检查按键事件

时间:2015-11-19 05:30:56

标签: c# multithreading performance asynchronous

我有一个带有两个线程的控制台应用程序,一个是重复耗时的工作,另一个是检查用户是否按下了ESC键。如果按下ESC键,则暂停耗时的工作线程,出现“是否确定”消息,如果选择是,则耗时的工作线程完成其当前循环然后退出。

由于while (!breakCurrentOperation(work)) ;循环,我必须检查按键的代码是否使用了大量CPU资源。我怎样才能防止这种情况发生?

代码:

    public void runTimeConsumingWork()
    {
        HardWork work = new HardWork();

        Thread workerThread = new Thread(() => work.StartWorking());
        workerThread.Start(); // Start the hard work thread

        while (!workerThread.IsAlive) ; // Hault untill Thread becomes Active 

        // Check if the user wants to stop the hard work
        while (!breakCurrentOperation(work)) ;

        // Cancle the hard work
        work.Stop();

        // Notify the User
        UserInterfaceController.WriteToConsole("Operation Cancled...");
    }


    public static bool breakCurrentOperation(HardWork work)
    {
        if (Console.KeyAvailable)
        {
            var consoleKey = Console.ReadKey(true);
            if (consoleKey.Key == ConsoleKey.Escape)
            {
                work.Pause(); // Pause
                UserInterfaceController.WriteToConsole("Do you want to stop the current process? \nType s to stop or c to continue.");
                string input = Console.ReadLine();
                if (input == "c" || input == "C")
                {
                    work.Pause(); // Unpause
                    return false; // Continue 
                }
                else if (input == "s" || input == "S")
                {
                    return true; // Break the loop
                }
                else
                {
                    UserInterfaceController.WriteToConsole("Error: Input was not recognized, the current process will now continue. Press Esc to stop the operation.");
                    work.Pause(); // Unpause
                }
            }
        }
        return false;
    }

如果我在主控制台UI线程中放置Thread.Sleep(2000),CPU使用率会下降,但应用程序会在2秒延迟时无响应。

2 个答案:

答案 0 :(得分:3)

你真的不得不经常投票吗?如果您在单独的线程中等待输入,只需使用Console.ReadKey。它将阻止输入线程,但您的其他线程将继续处理。你似乎没有在输入线程上做任何其他事情,所以阻止不应成为一个问题。

答案 1 :(得分:0)

看起来你的esc键按下检查逻辑由于while循环而在end less loop中运行。由于这个功能,该功能不断利用系统资源。

要解决这个问题,请使用Thread.Sleep在循环中使用一些延迟。 1秒的延迟将提高很多性能。