【发布时间】:2011-11-16 03:49:12
【问题描述】:
写一个无限循环很简单:
while(true){
//add whatever break condition here
}
但这会破坏 CPU 性能。这个执行线程将尽可能多地消耗 CPU 的能量。
降低对 CPU 影响的最佳方法是什么?
添加一些Thread.Sleep(n) 应该可以解决问题,但是为Sleep() 方法设置较高的超时值可能表明应用程序对操作系统没有响应。
假设我需要在控制台应用程序中每分钟左右执行一项任务。
我需要保持Main() 在“无限循环”中运行,而计时器将触发完成这项工作的事件。我想保持Main() 对CPU 的影响最小。
你建议什么方法。 Sleep() 可以,但正如我已经提到的,这可能表明操作系统没有响应线程。
稍后编辑:
我想更好地解释我在寻找什么:
我需要一个控制台应用程序而不是 Windows 服务。控制台应用可以在带有 Compact Framework 的 Windows Mobile 6.x 系统上模拟 Windows 服务。
只要 Windows Mobile 设备正在运行,我需要一种方法来保持应用程序的运行。
我们都知道控制台应用程序只要它的静态 Main() 函数运行就会运行,所以我需要一种方法来防止 Main() 函数退出。
在特殊情况下(比如:更新应用程序),我需要请求应用程序停止,所以我需要无限循环并测试一些退出条件。例如,这就是为什么
Console.ReadLine()对我没用。没有退出条件检查。关于上述,我仍然希望 Main() 函数尽可能资源友好。撇开检查退出条件的函数的指纹。
【问题讨论】:
-
Thread.Sleep(0)可能不错 -
你为什么不
Timer? -
@leppie
Sleep(0)放弃当前时间片的剩余部分,但仍会导致 100% 的 CPU 利用率。所以在这里不起作用。 -
您能否详细说明“可能表明应用程序对操作系统无响应”的问题?您确定这是控制台应用程序中的问题吗?
-
对于 SETI 和类似的应用程序,我会简单地降低我的进程/线程的优先级,这样当其他人需要它时它就不会获得 CPU 时间。
标签: c# .net console-application infinite-loop