0

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

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

mre.WaitOne();保持当前线路并等待信号。除此之外,如果我们将它与超时一起使用mre.WaitOne(100ms);

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

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

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

进程开始使用 ~%0 CPU 资源和waitone(timeout) 是什么意思?ThereIsAJobToExecute对我来说是Socket.HasData。那么这是否意味着对SerialPort.BytesToReadSocket.Available造成很大影响会使我们的 CPU 使用率更高?

每次点击都将线程保持 100 毫秒对我有什么副作用吗?假设一个socket程序或者一个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);
            }                              
        }

    }

编辑:对于 Socket 编程,它可以工作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();
     }
4

2 回答 2

1

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

于 2014-03-19T15:54:51.617 回答
0

我不是 100% 清楚你使用的是什么ManualResetEvent。然而...

做类似waitHandle.WaitOne(1)的事情几乎没有意义,因为你睡了这么短的时间,以至于你实际上忙于等待那个线程,并且消耗没有做任何事情的 CPU 资源。

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

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

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

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

于 2014-03-19T16:50:17.853 回答