繁体   English   中英

ManualResetEvent(EventWaitHandle)Set花费的CPU比WaitOne(超时)大得多

[英]ManualResetEvent(EventWaitHandle) Set spends much cpu than WaitOne(timeout)

在实现ManualResetEvent时,我感到有些惊讶,

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

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

但! 让我们假设StartCommunicate是线程的工作。

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

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

该进程开始使用带有Waitone(timeout)的 〜%0 CPU资源,这是什么意思? ThereIsAJobToExecuteSocket.HasData我。 那么这是否意味着对SerialPort.BytesToReadSocket.Available的访问过多会使我们的CPU使用率更高?

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

因此,使用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();
     }

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

对我来说,您要使用ManualResetEvent的目的还不是100%清楚。 然而...

waitHandle.WaitOne(1)这样的事情几乎是没有意义的,因为您睡眠时间非常短,以至于您实际上在忙于等待该线程,并且消耗了没有做任何事情的CPU资源。

如果您想告诉线程应该唤醒并处理数据,请尝试执行以下操作:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM