簡體   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