[英]ManualResetEvent.WaitOne() returning false without timeout?
[英]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資源,這是什么意思? ThereIsAJobToExecute是Socket.HasData我。 那么這是否意味着對SerialPort.BytesToRead或Socket.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.