2011-05-20 69 views
6

我实现在C#中一个非常基本的线索:线程得到100%的CPU速度非常快

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)循环内被读取。为什么它是这样的?

在此先感谢。

+0

我们可以假设''while'循环中实际上有一些实现,它有一定的终止能力吗? – Yuck 2011-05-20 00:12:31

+1

根据此代码获得100%的CPU是正确的。有没有想要检查传感器数据的间隔?可能你可能需要相应地睡觉线程。 – CharithJ 2011-05-20 00:14:47

回答

12

while (true)是什么杀死你的CPU。

您可以添加Thread.Sleep(X)给您,同时在再次检查之前给CPU一些休息。

此外,似乎你实际上需要一个计时器。

看看这里的Timer类之一http://msdn.microsoft.com/en-us/library/system.threading.timer.aspx

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

+0

嗨。谢谢。但是,我该如何等待数据传入?我想不断检查数据。 – olidev 2011-05-20 00:13:31

+1

你需要多久检查一次?即使让它睡10ms也会产生巨大的影响。 – 2011-05-20 00:16:10

+0

@JoesyXHN - 你的数据来自哪里? – 2011-05-20 00:16:22

2

让你的循环。它四处乱跑,并且变得疲倦。至少,最终让中断

+0

我应该使用:timer.tick每1毫秒,而不是使用线程while循环和睡眠1毫秒? – olidev 2011-05-20 00:14:38

+0

BAHAHAHAHAHAHAHA! 1毫秒!尝试100-500毫秒。 – 2011-05-20 00:29:58

0

你可以使用阻塞队列。从阻塞队列中取出一个项目将阻塞该线程,直到有一个项目放入队列。这不会花费任何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之外,无法阻止该线程。睡眠

+0

如果JoesyXHN需要检查文件或外部API或其他内容,阻止收集会有帮助吗? – 2011-05-20 00:30:37

+0

你是对的。如果他想看一个文件或数据来自外部API。阻止收集是没用的。 – 2011-05-20 00:44:04

+0

所以我问他数据来自哪里。 – 2011-05-20 00:45:14

1

因为你的函数是不是在做,而块内的任何东西,它抓住了CPU,并且对于所有的实际目的,不会放手吧,所以其他线程可以做他们的工作

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

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

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

     Thread.Sleep(1000); 
    } 
} 
+0

请不要做微不足道的修改只是为了阻止你的帖子。鼓励编辑,但请做出实际的改进。谢谢! – 2011-07-13 22:27:32

0

如果你轮询的条件,绝对不为其他人则建议,把睡眠。我还补充说,如果您需要最佳性能,您可以使用统计技巧避免在读取传感器数据时进行睡眠。当您检测到传感器数据处于空闲状态时,例如说,连续10次,然后再次开始每次迭代休眠。