C# 如何使程序不使用100%的cpu?

C# 如何使程序不使用100%的cpu?,c#,multithreading,windows-services,threadpool,C#,Multithreading,Windows Services,Threadpool,有5个线程在无限循环中运行 其中2个将在队列不为空时发送消息 其中4个会在5分钟内持续发送心跳信号 其中之一是从另一个来源请求数据 当它使用100%的CPU时,我不能使用窗口中的任何其他应用程序。整个窗户变得很慢 编辑:睡眠可以放在WaitOne之后吗? if(autoEvent.WaitOne()) { } else { } Thread.Sleep(100); 能否将睡眠放在subscriber.Recv()之后,即ZeroMQ? if(autoEvent.WaitOne()) { } e

有5个线程在无限循环中运行

其中2个将在队列不为空时发送消息

其中4个会在5分钟内持续发送心跳信号

其中之一是从另一个来源请求数据

当它使用100%的CPU时,我不能使用窗口中的任何其他应用程序。整个窗户变得很慢

编辑:睡眠可以放在WaitOne之后吗?

if(autoEvent.WaitOne())
{
}
else
{
}
Thread.Sleep(100);
能否将睡眠放在subscriber.Recv()之后,即ZeroMQ?

if(autoEvent.WaitOne())
{
}
else
{
}
Thread.Sleep(100);

如果没有Recv(),我将所有线程置于睡眠状态,但是有一个线程我不敢在只有client.Send的实时数据源线程中置于睡眠状态,只有一个线程会导致100%?

放置System.Threading.thread.sleep(100)(100毫秒睡眠=系统执行其他操作的时间)在无限循环中。

Q:如何使程序不使用100%的CPU

if(autoEvent.WaitOne())
{
}
else
{
}
Thread.Sleep(100);
答:不要创建忙循环

阻塞是好的。有很多方法可以实现“阻止直到有事情要做”。包括使用报警信号或计时器(虽然效果很差,但有一定的改进)、读取带有超时的套接字(如果您碰巧收到网络套接字的通知)或使用带有超时的Windows事件对象

如果其他所有操作都失败,则始终可以使用“Sleep()”。如果可以避免的话,我不鼓励使用“睡眠”——几乎总是有更好的设计策略。但它将使您避免100%的CPU繁忙循环;)

=======================================

附录:你发布了一些代码(谢谢!)

您正在使用xxx.WaitOne()

只需使用WaitOne()(一个阻塞调用)并超时即可。这是一个理想的解决方案:没有繁忙的循环,没有“睡眠”的要求


对于发送消息的线程,当队列为emtpy时,使用ResetEvent

DeliverMessageThread_DoWork
{
  while(true)
  {
    if(GetNextMessage() == null)
      MyAutoResetEvent.WaitOne(); // The thread will suspend here until the ARE is signalled
    else
    {
      DeliverMessage();
      Thread.Sleep(10); // Give something else a chance to do something
     }
  }
}

MessageGenerator_NewMessageArrived(object sender, EventArgs e)
{
   MyAutoResetEvent.Set(); // If the deliver message thread is suspended, it will carry on now until there are no more messages to send
}

这样,你就不会让两个线程一直占用所有的CPU周期了

发布一些代码,特别是对于无限循环,当队列不是emptynice问题时,但我认为主要的问题是属于MS Win机器,我的Win7真的很重,它似乎是用CPU玩的,花了1G!当所有的服务都被禁用时,它会影响subscriber.Recv()吗?当把sleep放在它后面时,我只是担心它会丢失一些消息。你能显示一些代码吗?Recv()函数可能一直在休眠,直到它接收到数据为止。据我所知,您不需要在使用subscriber的线程中休眠。Recv()您是对的,但是有一个线程没有Recv(),它是一个发布者,只是发送消息。如果放入新的TimeSpan(0,0,1),那就太棒了在waitone中,如果可能的话,所有线程都会休眠,但是有一个线程我不敢在只有client.Send的实时数据源线程中休眠,一个线程会导致100%的CPU利用率吗?A:是的;)为什么不呢?