实现ManualResetEvent时让我感到惊讶,
据我了解mre.Set()
命令信号并让其他进程执行。
mre.WaitOne();
保持当前行并等待信号。除此之外,如果我们使用超时mre.WaitOne(100ms);
BUT!让我们假设 StartCommunicate 是一个线程的工作。
如果我使用waitHandle.Set();
,我的进程使用〜%25或另一个项目〜%1 CPU资源。
但是如果我使用waitHandle.WaitOne(100);
(超时值是符号的。它(尝试)等待100ms的信号)。
该过程开始使用〜%0 CPU资源与 waitone(超时) 这是什么意思 ? ThereIsAJobToExecute 对我来说是 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);
}
}
}
编辑:对于套接字编程,可以使用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();
}
答案 0 :(得分:1)
WaitOne
将线程置于挂起状态,这不会占用CPU资源。来自ManualResetEvent
的信号稍后唤醒了线程。
答案 1 :(得分:0)
我并非100%清楚您使用ManualResetEvent
的内容。然而...
做waitHandle.WaitOne(1)
这样的事情几乎毫无意义,因为你正在沉睡这么短的时间,以至于你有效地忙着等待那个线程,并且消耗掉了非资源的CPU资源做任何事情。
如果你想告诉你的线程它应该唤醒并处理数据,那么试试这样的事情:
while(true)
{
waitHandle.Wait();
waitHandle.Reset();
while(ThereIsAJobToExecute)
{
// Process the jobs
}
}
当没有任何事情要做时,这将使你的线程进入睡眠状态,并且它不会浪费任何资源。现在,当有工作要做时,你可以用waitHandle.Set()
发出信号。