[英]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.