ManualResetEvent(EventWaitHandle) Set比WaitOne(timeout)占用更多的c



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

根据我对mre.Set()命令信号的理解,让其他进程执行。

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

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

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

但是如果我使用waitHandle.WaitOne(100);(超时值是象征性的。它(try)等待一个信号100毫秒。

进程开始使用~%0 CPU资源,waitone(timeout)这是什么意思?ThereIsAJobToExecute is Socket。HasData为我。那么,这是否意味着要对SerialPort进行多次命中?BytesToReadSocket。使我们的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);
            }                              
        }
    }

EDIT:对于套接字编程,它可以工作ASYN,所以我们可以通过下面的代码轻松地做到这一点,我们不需要轮询。

但是RS232通信端口编程我需要它。

 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将线程置于挂起状态,这不会占用CPU资源。来自ManualResetEvent的信号随后唤醒线程。

我不是100%清楚你使用ManualResetEvent的目的。然而…

做一些像waitHandle.WaitOne(1)这样的事情是毫无意义的,因为你睡觉的时间很短,你实际上是在忙着等待那个线程,并消耗CPU资源,而这些CPU资源什么都不做。

如果你想告诉你的线程,它应该唤醒和处理数据,然后尝试这样做:

while(true)
{
  waitHandle.Wait();
  waitHandle.Reset();
  while(ThereIsAJobToExecute)
  {
    // Process the jobs
  }
}

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

相关内容

  • 没有找到相关文章

最新更新