ManualResetEvent(EventWaitHandle)设置比WaitOne(超时)花费更多的CPU

时间:2014-03-19 15:51:04

标签: c# multithreading sockets event-wait-handle

实现ManualResetEvent时让我感到惊讶,

据我了解mre.Set()命令信号并让其他进程执行。

mre.WaitOne();保持当前行并等待信号。除此之外,如果我们使用超时mre.WaitOne(100ms);

BUT!让我们假设 StartCommunicate 是一个线程的工作。

如果我使用waitHandle.Set();,我的进程使用〜%25或另一个项目〜%1 CPU资源。

但是如果我使用waitHandle.WaitOne(100);(超时值是符号的。它(尝试)等待100ms的信号)。

该过程开始使用〜%0 CPU资源与 waitone(超时) 这是什么意思 ? ThereIsAJobToExecute 对我来说是 Socket.HasData 。那么它是否意味着对 SerialPort.BytesToRead Socket.Available 的大量使用会使我们的CPU使用率更高?

对于每次击中持有100毫秒的线程,是否有任何副作用?假设套接字程序或rs232连接波特率相对较新一代PC非常低。

所以使用mre.WaitOne(1);似乎比我更好。你怎么看待这件事 ?我正在对一些内存和性能分析器进行一些实验,但我不确定我是否为各种类型的客户端机器做了最佳解决方案......

渴望你的评论。

提前致谢!

    ManualResetEvent waitHandle = new ManualResetEvent(false);
    public void StartCommunicate()
    {
        while (true)
        {
            if (ThereIsAJobToExecute)
            {
                Execute the job here!
            }
            else {
                //waitHandle.Set();
                waitHandle.WaitOne(1);
            }                              
        }

    }

编辑:对于套接字编程,可以使用ASYN,因此我们可以通过以下代码轻松完成,我们不需要轮询。

但我需要RS232 COMM端口编程。或者不是?

 do
 {
      socket.BeginReceiveASYN(....ReceiveCallBack,...,socket)
      mre.WaitOne();
      mre.Reset();
 }while(true)

     void ReceiveCallBack(IResult rst)
     {
     //get the socket and do my job here!
      mre.Set();
     }

2 个答案:

答案 0 :(得分:1)

WaitOne将线程置于挂起状态,这不会占用CPU资源。来自ManualResetEvent的信号稍后唤醒了线程。

答案 1 :(得分:0)

我并非100%清楚您使用ManualResetEvent的内容。然而...

waitHandle.WaitOne(1)这样的事情几乎毫无意义,因为你正在沉睡这么短的时间,以至于你有效地忙着等待那个线程,并且消耗掉了非资源的CPU资源做任何事情。

如果你想告诉你的线程它应该唤醒并处理数据,那么试试这样的事情:

while(true)
{
  waitHandle.Wait();
  waitHandle.Reset();

  while(ThereIsAJobToExecute)
  {
    // Process the jobs
  }
}

当没有任何事情要做时,这将使你的线程进入睡眠状态,并且它不会浪费任何资源。现在,当有工作要做时,你可以用waitHandle.Set()发出信号。