在实施 ManualResetEvent 时,有些事情让我感到惊讶,
据我了解mre.Set()
命令信号并让其他进程执行。
mre.WaitOne();
保持当前线路并等待信号。除此之外,如果我们将它与超时一起使用mre.WaitOne(100ms);
但!让我们假设StartCommunicate是一个线程的工作。
如果我使用waitHandle.Set();
我的进程使用 ~%25 或另一个项目 ~%1 CPU 资源。
但是如果我使用 waitHandle.WaitOne(100);
(超时值是象征性的。它(尝试)等待信号 100 毫秒)。
进程开始使用 ~%0 CPU 资源和waitone(timeout) 是什么意思?ThereIsAJobToExecute对我来说是Socket.HasData。那么这是否意味着对SerialPort.BytesToRead或Socket.Available造成很大影响会使我们的 CPU 使用率更高?
每次点击都将线程保持 100 毫秒对我有什么副作用吗?假设一个socket程序或者一个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();
}