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

Dav*_*gan 0 .net c# multithreading

我把一个控制台/表单混合程序放在一起,为了实现我正在寻找的行为,我必须在一个线程中"运行"控制台,然后用另一个启动仪表板.

我用过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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

现在我遇到的问题是加载序列结束时的循环.此循环可防止所有事务都关闭,直到两个后台工作程序都已完成(窗体关闭或控制台发送命令关闭)

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);
}
Run Code Online (Sandbox Code Playgroud)

问题是CPU使用率,它一直保持在30%,这是没有你上面看到的那条线 System.Threading.Thread.Sleep(10)

我的问题是,这样可以吗?如果没有,我有什么解决方案?我注意到这确实纠正了这个问题,当应用程序没有做任何事情时,CPU现在的速度为0%.我也没有看到任何性能变化.但它还没有真正被"推",所以我不能肯定地说后者的观察.

Vil*_*lx- 6

而不是轮询(每隔10毫秒检查,就像你已经完成的那样),"更好"(或至少是CPU密集度更低)的解决方案是使用某种等待功能.您可以使用命名空间中ManualResetEvent可能或任何其他同步对象System.Threading.取决于你需要什么.然后你可以调用.Wait()该对象,它将阻塞线程(0%的实际CPU使用率),直到某种信号从另一个线程到达.