如何使程序不使用100%的CPU?

时间:2013-07-17 08:51:46

标签: c# multithreading windows-services threadpool

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

当队列不为空时,其中2个将发送消息。

其中4人将在5分钟内继续发送心跳。

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

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

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

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

可以在subscriber.Recv()之后放入ZeroMQ吗?

所有线程如果没有Recv()我就睡了,但是有一个线程我不敢在只有client.Send的实时datafeed线程中放一个睡眠,只有一个线程会导致100%?

3 个答案:

答案 0 :(得分:4)

问:如何使程序不使用100%CPU?

答:不要创建一个繁忙的循环!!!!

阻止是好的。有很多方法可以实现“阻止直到有事可做”。包括使用报警信号或定时器(差,但有一定的改进),使用超时(如果您恰好通过网络套接字通知)执行套接字读取或使用超时的Windows事件对象。

失败一切,你总是可以使用“睡眠()”。如果你能避免使用“睡眠”,我会劝阻它 - 几乎总有更好的设计策略。但它让你远离100%CPU繁忙的循环;)

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

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

你正在使用xxx.WaitOne()。

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

http://msdn.microsoft.com/en-us/library/aa332441%28v=vs.71%29.aspx

答案 1 :(得分:1)

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

答案 2 :(得分:0)

对于发送消息的线程,当队列为空时,使用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
}

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