我把一个控制台/表单混合程序放在一起,为了实现我正在寻找的行为,我必须在一个线程中“运行”控制台,然后用另一个启动仪表板。
我使用了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%的速度骑行。我也没有看到任何性能变化。但它还没有真正被“推”,所以我不能肯定地说后一种观察。
答案 0 :(得分:6)
而不是轮询(每隔10毫秒检查,就像你已经完成的那样),“更好”(或至少是CPU密集度更低)的解决方案是使用某种等待功能。您可以使用ManualResetEvent
可能,或System.Threading
命名空间中可用的任何其他同步对象。取决于你需要什么。然后你可以在该对象上调用.Wait()
,它将阻塞线程(0%的实际CPU使用率),直到某种信号从另一个线程到达。