簡體   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