线程获得100%CPU非常快

我在C#中实现了一个非常基本的线程:

private Thread listenThread; public void startParser() { this.listenThread = new Thread(new ThreadStart(checkingData)); this.listenThread.IsBackground = true; this.listenThread.Start(); } private void checkingData() { while (true) { } 

}

然后我立即获得100%的CPU。 我想检查传感器数据是否在while(true)循环内读取。 为什么会这样?

提前致谢。

while (true)是杀死CPU的原因。

您可以添加Thread.Sleep(X) ,同时在再次检查之前为CPU提供一些rest。

而且,看起来你真的需要一个Timer。

在这里查看一个Timer类http://msdn.microsoft.com/en-us/library/system.threading.timer.aspx 。

使用尽可能高的拉动间隔的定时器,1秒,半秒。
您需要在CPU使用率和检查之间可以承受的最大延迟之间进行权衡。

让你的循环睡觉 。 它四处乱窜,累了。 至少,让它最终rest一下

因为你的函数没有在while块中做任何事情,它抓住CPU,并且,出于所有实际目的,永远不要放弃它,所以其他线程可以做他们的工作

 private void checkingData() { while (true) { // executes, immediately } } 

如果将其更改为以下内容,您应该会看到更合理的CPU消耗:

 private void checkingData() { while (true) { // read your sensor data Thread.Sleep(1000); } } 

你可以使用阻塞队列。 从阻塞队列中取一个项将阻塞该线程,直到有一个项放入队列。 这不会花费任何CPU。

使用.net4,您可以使用BlockingCollection http://msdn.microsoft.com/en-us/library/dd267312.aspx

在版本4下,没有阻塞队列int .net框架。

如果你谷歌它你可以找到许多阻止队列的工具。

这是一个实现

http://www.codeproject.com/KB/recipes/boundedblockingqueue.aspx

顺便说说。 你等待的数据来自哪里?

编辑

如果你想检查文件。 你可以使用FileSystemWatcher来检查线程块。

如果你的数据来自外部API并且api没有阻塞线程,除了使用Thread.Sleep之外没有办法阻止线程

如果你正在调查一个病情,肯定按照其他人的建议进行,并进入睡眠状态。 我还补充说,如果您需要最高性能,您可以使用统计技巧来避免在读取传感器数据时hibernate。 当您检测到传感器数据空闲时(例如,连续10次),然后再次开始在每次迭代中hibernate。