线程获得100%CPU非常快

时间:2011-05-20 00:08:41

标签: c# .net multithreading parallel-processing cpu-usage

我在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)循环内读取传感器数据。为什么会这样?

提前致谢。

5 个答案:

答案 0 :(得分:15)

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

您可以添加Thread.Sleep(X),同时在重新检查之前为CPU提供一些休息。

此外,您似乎确实需要一个计时器。

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

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

答案 1 :(得分:2)

让你的循环睡眠。它在四处奔波并且累了。至少,最后让它中断

答案 2 :(得分:2)

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

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

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

private void checkingData()
{
    while (true)
    {
        // read your sensor data 

        Thread.Sleep(1000);
    }
}

答案 3 :(得分:0)

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

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

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

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

这是一个实现

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

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

修改

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

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

之外没有办法阻止线程

答案 4 :(得分:0)

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