在实现ManualResetEvent时,有些事情让我感到惊讶,
根据我对mre.Set()
命令信号的理解,让其他进程执行。
mre.WaitOne();
保持当前线路,等待信号。除此之外,如果我们使用timeout mre.WaitOne(100ms);
但是!让我们假设 startcommunication 是线程的工作。
如果我使用waitHandle.Set();
,我的进程使用~%25或为另一个项目使用~%1 CPU资源。
但是如果我使用waitHandle.WaitOne(100);
(超时值是象征性的。它(try)等待一个信号100毫秒。
进程开始使用~%0 CPU资源,waitone(timeout)这是什么意思?ThereIsAJobToExecute is Socket。HasData为我。那么,这是否意味着要对SerialPort进行多次命中?BytesToRead或Socket。使我们的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);
}
}
}
EDIT:对于套接字编程,它可以工作ASYN
,所以我们可以通过下面的代码轻松地做到这一点,我们不需要轮询。
但是RS232通信端口编程我需要它。
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
将线程置于挂起状态,这不会占用CPU资源。来自ManualResetEvent
的信号随后唤醒线程。
我不是100%清楚你使用ManualResetEvent
的目的。然而…
做一些像waitHandle.WaitOne(1)
这样的事情是毫无意义的,因为你睡觉的时间很短,你实际上是在忙着等待那个线程,并消耗CPU资源,而这些CPU资源什么都不做。
如果你想告诉你的线程,它应该唤醒和处理数据,然后尝试这样做:
while(true)
{
waitHandle.Wait();
waitHandle.Reset();
while(ThereIsAJobToExecute)
{
// Process the jobs
}
}
这将使你的线程在无事可做时进入睡眠状态,并且不会浪费任何资源。现在,当有工作要做时,可以用waitHandle.Set()
给它发信号。