0

我正在尝试使用可以发送命令并接收响应的设备设置一些通信。但是,我确实想确保我控制超时标志以防止无限期的等待时间。

我做了这样的事情:

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();

我得到不一致的结果,即当我得到第二个命令(取消)的响应时,有时两个线程都会继续,我可以理解,但有时第一个线程会达到 30000 毫秒超时 - 我无法解释。

关于我缺少什么和/或做错了什么的任何建议?

4

1 回答 1

3

EventWaitHandle 在这里不是合适的同步对象。您需要互斥,以便只有一个线程可以处于发送命令并等待响应的状态。换句话说,线程必须严格轮流与设备对话。

ManualResetEvent 并不能保证,只要您调用 Set(),所有在 WaitOne() 调用上阻塞的线程都将被解除阻塞。如果这不止一个,那么当两个或多个线程尝试同时发送命令时,您的程序将出现故障。

互斥体提供互斥。它就是这样得名的。

于 2014-04-22T08:22:56.120 回答