【发布时间】:2014-03-19 15:51:03
【问题描述】:
在实现 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); 对我来说似乎更可取。你怎么看待这件事 ?我正在用一些内存和性能分析器做一些实验,但我不确定我是否正在为各种客户端机器做最佳解决方案......
渴望你的cmets。
提前致谢!
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 我将编辑我的问题以使其更清楚。
-
@Damien_The_Unbeliever 你是对的,他们的工作是不同的。我刚刚注意到,通过 WaitOne,我可以减轻线程的负担,从而更有效地利用 CPU。我认为 com 端口轮询不需要太多 CPU。我正在尝试通过从 com 端口获取 1000 个字节,处理顺序字节来绘制实时图表……这才是真正的工作。我同意,这听起来很奇怪,但我正在尝试所有方法来实现这一点。
-
比较苹果和橙子是不公平的。
Set和WaitOne是正交的。而且..顺便说一句,您的异步套接字代码正在浪费线程等待,因此您无法从异步中获得任何可伸缩性,因此使用同步套接字比让线程等待直到您收到数据要好。
标签: c# multithreading sockets event-wait-handle