2014-03-19 23 views
0

在實施ManualResetEvent的東西讓我感到驚訝,的ManualResetEvent(的EventWaitHandle)設置花費大量的cpu高了WaitOne(超時)

據我瞭解mre.Set()指令信號,讓其他進程執行。

mre.WaitOne();保持在當前行並等待信號。除此之外,如果我們使用它與超時mre.WaitOne(100ms);

但是!讓我們假設StartCommunicate是一個線程的工作。

如果我使用waitHandle.Set();我的進程使用〜%25或用於另一個項目〜%1 CPU資源。

但是,如果我使用waitHandle.WaitOne(100);(超時值是符號的,它(嘗試)等待100ms的信號)。

該進程開始使用〜%0 CPU資源waitone(超時) 這是什麼意思? ThereIsAJobToExecute is Socket.HasData對我來說。那麼這是否意味着打到SerialPort.BytesToReadSocket.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); 
      }        
     } 

    } 

編輯:對於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(); 
    } 
+1

'Set()'和'WaitOne'很少可以互換。我不清楚爲什麼你認爲他們在這種情況下。 –

+0

通常,無論生成'JobToExecute'如何執行信號。這是線程間通信的主要點 - 不需要進行任何輪詢。 –

+0

@MartinJames我要編輯我的問題,使其更清楚。 –

回答

1

WaitOne將線程置於掛起狀態,這不佔用CPU資源。來自ManualResetEvent的信號稍後喚醒線程。

0

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

做一些像waitHandle.WaitOne(1)這樣的事情是非常沒有意義的,因爲你正在睡那麼短的時間,以致於在這個線程上等待的時間非常繁忙,並且消耗了無用的CPU資源。

如果你正在尋找要告訴你的線程,它應該喚醒和處理數據,然後嘗試這樣的事:

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

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

這將使你的線程時有什麼做睡覺,它不會浪費任何資源。當有工作要做時,您可以用waitHandle.Set()來發信號。

+0

我認爲如果waitHandle的狀態爲false(如果你的意思是等待),你的代碼將無法工作。我想通過等待一段時間我只是做了一個計時器的睡眠工作。我這樣做是爲了避免輪詢的CPU過度使用,而我只是在沒有工作時才這樣做。如果有SYNC作業,它會完成作業並再次輪詢。但是沒有工作讓我們稍等一下再問一次。就像「不要經常問我同樣的問題」。它比NOP需要更多的時間。 您在回答之前是否閱讀過評論? –

+0

如果事件沒有發出信號,則線程將休眠直到它變成信號。如果沒有工作讓它執行你喜歡做的事情而不是睡覺?你的問題不是很清楚你想做什麼,所以我已經做出了最好的猜測。 – Sean

+0

假設有一個輪詢工作。您沒有通知變更。然後你問一個連續的循環。但是,確定是否有工作(這成爲另一項工作)需要時間,並且無需經常詢問這種改變。順便說一句,你很少問你爲了 - 不執行IsThereAJobMethod-而獲得一些免費的CPU資源。我問這個問題了解真正發生了什麼。我認爲David Haney是對的。 –

相關問題