[英]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.