在實施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.BytesToRead或Socket.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();
}
'Set()'和'WaitOne'很少可以互換。我不清楚爲什麼你認爲他們在這種情況下。 –
通常,無論生成'JobToExecute'如何執行信號。這是線程間通信的主要點 - 不需要進行任何輪詢。 –
@MartinJames我要編輯我的問題,使其更清楚。 –