繁体   English   中英

通过无限while循环防止高CPU使用率的正确方法(控制台/窗体混合)

[英]Correct way to prevent high CPU usage with infinite while loop (Console/Forms hybrid)

我整理了一个控制台/窗体混合程序,并实现了我想要的行为,我必须在一个线程中“运行”控制台,然后与另一个控制台一起启动仪表板。

我为此使用了BackgroundWorker 本质上,在Main方法中,我启动了控制台后台工作程序,该后台工作程序在其DoWork块中执行正常的while循环以保持控制台正常运行。 重复检查来自控制台的输入,并将其传递给相应的操作。

while (true && !Program.Shutdown)
{
    String consoleInput = "";

    consoleInput = Program.ReadFromConsole();

    if (String.IsNullOrWhiteSpace(consoleInput))
        continue;

    try
    {
        Program.Shell(consoleInput);
    }
    catch (Exception ex)
    {
        Program.WriteToConsole(ex.Message);
    }
}

在启动控制台的后台工作程序被调用之后,即ConsoleBackgroundWorker.RunWorkerAsync()我调用了执行加载序列的方法。

此加载序列可以调用第二个后台工作程序,该后台工作程序在单独的线程上内部启动仪表板。

现在我面临的问题是加载序列末尾的循环。 此循环防止一切都关闭,直到两个后台工作人员都完成为止(窗体关闭或控制台发送了关闭命令)

while (ConsoleBackgroundWorker != null && DashboardBackgroundWorker != null)
{
    /* I'm not sure of how else to fix this. But 
     * this corrects the high CPU usage reported 
     * in the Task Manager. */
    System.Threading.Thread.Sleep(10);
}

问题是CPU使用率,它一直保持在30%,这与System.Threading.Thread.Sleep(10)上方的行完全不同

我的问题是,可以吗? 如果没有,我有什么解决方案? 我注意到这确实解决了问题,当应用程序不执行任何操作时,CPU现在的运行速度为0%。 我也没有看到任何性能变化。 但这还没有真正“推开”,因此我不能肯定地说后面的观察。

与其轮询(每10毫秒检查一次),不如“更好”(或至少减少CPU占用)的解决方案是使用某种等待功能。 您可以使用ManualResetEvent ,也可以使用System.Threading命名空间中可用的任何其他同步对象。 取决于您的需求。 然后,您可以在该对象上调用.Wait() ,它将阻塞线程(实际CPU使用率为0%),直到某种信号从另一个线程到达为止。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM