我有一个带有两个线程的控制台应用程序,一个是重复耗时的工作,另一个是检查用户是否按下了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秒延迟时无响应。
答案 0 :(得分:3)
你真的不得不经常投票吗?如果您在单独的线程中等待输入,只需使用Console.ReadKey。它将阻止输入线程,但您的其他线程将继续处理。你似乎没有在输入线程上做任何其他事情,所以阻止不应成为一个问题。
答案 1 :(得分:0)
看起来你的esc键按下检查逻辑由于while循环而在end less loop中运行。由于这个功能,该功能不断利用系统资源。
要解决这个问题,请使用Thread.Sleep在循环中使用一些延迟。 1秒的延迟将提高很多性能。