我正在尝试用一个设备设置一些命令,在这个设备上你可以发送命令并接收响应。然而,我确实想确保我控制一个超时标志,以防止无限等待时间。
我做了这样的事:
private volatile EventWaitHandle _signal;
public void Send()
{
// Do something
_signal.WaitOne(30000);
// Continue with something else
_signal.Reset();
}
public void Receive()
{
_signal.Set();
}
我的问题是,如果我有多个线程(本例中假设为2个)可以访问Send方法和以下场景:
线程A:
// Sends a "listen" command, but no response is received
Send();
线程B:
// Sends a "cancel" command and response (success) is received
Send();
我得到了不一致的结果,即有时当我得到第二个命令(cancel)的响应时,两个线程都会继续,我可以理解,但有时第一个线程会达到30000ms的超时-我无法解释。
关于我遗漏了什么和/或做错了什么,有什么建议吗?
EventWaitHandle不是此处合适的同步对象。您需要互斥,这样只有一个线程可以处于发送命令并等待响应的状态。换句话说,线程必须严格地轮流与设备对话。
ManualResetEvent并不能保证,只要调用Set(),所有在WaitOne()调用上阻塞的线程都将被解除阻塞。如果不止一个,那么当两个或多个线程试图同时发送命令时,程序将出现故障。
Mutex提供了MUTual排除。它就是这样得名的。