我正在尝试使用可以发送命令并接收响应的设备设置一些通信。但我想确保控制超时标志以防止无限期等待。
我做了类似的事情:
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();
我得到不一致的结果,即有时两个线程都在我得到第二个命令(取消)的响应时继续,我可以理解,但有时第一个线程将达到30000ms超时 - 我无法解释。
关于我遗失和/或做错的任何建议?
答案 0 :(得分:3)
EventWaitHandle不是此处的相应同步对象。您需要mutual exclusion,以便只有一个线程可以处于发送命令并等待响应的状态。换句话说,线程必须严格轮流与设备通信。
只要您调用Set()然后 all ,一个ManualResetEvent就不会给您这种保证,将取消阻止WaitOne()调用中阻塞的线程。如果这不止一个,那么当两个或多个线程同时尝试发送命令时,程序将会出现故障。
Mutex提供MUTual EXclusion。这就是它的名字。