C# 线程获得100%的CPU速度非常快

C# 线程获得100%的CPU速度非常快,c#,.net,multithreading,parallel-processing,cpu-usage,C#,.net,Multithreading,Parallel Processing,Cpu Usage,我正在用C#实现一个非常基本的线程: } 然后我立即得到100%的CPU。我想检查传感器数据是否在while(true)循环中读取。为什么会这样 提前谢谢 while(true)是杀死CPU的原因 您可以添加Thread.Sleep(X),让CPU在再次检查之前休息一下 而且,看起来你真的需要一个计时器 看看这里的一个计时器类 使用尽可能高的拉动间隔的计时器,1秒或半秒。 您需要在CPU使用率和检查之间可承受的最大延迟之间进行权衡。让您的循环休眠。它跑来跑去,越来越累。至少,让它最终休息一下。您

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

}

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

提前谢谢

while(true)
是杀死CPU的原因

您可以添加
Thread.Sleep(X)
,让CPU在再次检查之前休息一下

而且,看起来你真的需要一个计时器

看看这里的一个计时器类

使用尽可能高的拉动间隔的计时器,1秒或半秒。

您需要在CPU使用率和检查之间可承受的最大延迟之间进行权衡。

让您的循环休眠。它跑来跑去,越来越累。至少,让它最终休息一下。

您可以使用阻塞队列。从阻塞队列中获取项目将阻塞线程,直到有项目放入队列。这不需要任何cpu

使用.net4,您可以使用BlockingCollection

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

如果你在谷歌上搜索,你会发现很多阻塞队列的工具

这里是一个实现

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

编辑

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


如果您的数据来自外部API,并且API没有阻止线程,那么除了使用线程之外,没有其他方法阻止线程。睡眠

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

private void checkingData()
{
    while (true)
    {
        // executes, immediately
    }
}
如果将其更改为以下内容,您应该会看到更合理的CPU消耗:

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

        Thread.Sleep(1000);
    }
}

如果你正在调查一种情况,一定要按照别人的建议去做,然后睡觉。我还要补充一点,如果您需要最大的性能,您可以使用统计技巧来避免在读取传感器数据时睡觉。当您检测到传感器数据处于空闲状态时,比如说,连续10次,然后在每次迭代中再次开始休眠。

我们是否可以假设
while
循环中确实有一些实现,并且它有一些终止的能力?根据此代码,获得100%的CPU是正确的。是否有检查传感器数据的时间间隔?也许你得相应地睡一觉。谢谢但我怎么能等待数据的到来呢?我想继续检查即将到来的数据。您需要多久进行一次实际检查?即使让它休眠10毫秒也会产生巨大的影响。@JoesyXHN-你的数据来自哪里?我应该使用:timer.tick per 1毫秒,而不是使用带有while循环的线程并休眠1毫秒吗?哈哈哈!1毫秒!尝试100-500毫秒。如果JoesyXHN需要检查文件或外部API或其他东西,阻止收集将有何帮助?您是对的。如果他想查看文件或数据来自外部API。阻止收集是没有用的。所以我问他数据来自哪里。请不要仅仅为了破坏你的帖子而进行琐碎的编辑。鼓励编辑,但请进行实际改进。谢谢
private void checkingData()
{
    while (true)
    {
        // read your sensor data 

        Thread.Sleep(1000);
    }
}