명령을 보내고 응답을받을 수있는 장치로 일부 통신을 설정하려고합니다. 그러나 나는 무한 대기 시간을 방지하기 위해 타임 아웃 플래그를 제어하고 싶다.EventWaitHandle - 복수 스레드 = 일관되지 않은 동작
내가 이런 짓을 :
스레드 :
private volatile EventWaitHandle _signal;
public void Send()
{
// Do something
_signal.WaitOne(30000);
// Continue with something else
_signal.Reset();
}
public void Receive()
{
_signal.Set();
}
내 질문은 내가 여러 스레드가있는 경우 전송 방법 및 다음과 같은 시나리오를 액세스 할 수 있습니다 (의이 예를 들어 2를 가정 해 봅시다)이며, A :
// Sends a "listen" command, but no response is received
Send();
스레드 B :
// Sends a "cancel" command and response (success) is received
Send();
,
내가 이해할 수있는 두 번째 명령 (취소)에 대한 응답을받을 때 때때로 두 스레드가 계속 일치하지 않는 경우가 있습니다. 그러나 때로는 첫 번째 스레드가 30000ms 시간 초과에 도달 할 때가 있습니다.
제가 누락되거나 잘못하고있는 것에 대한 조언이 있습니까?
'AutoResetEvent'를 사용하고 있지 않습니까? 'ManualResetEvent'를 사용해야합니다. 그렇지 않으면 대기중인 스레드가 신호를 받으면 자동으로 재설정됩니다. 실제로 대기 핸들을 전혀 사용하지 않으려 고합니다. NET 4.5.1을 사용할 여력이 있다면 특히 당신이하려는 일에 더 나은 해결책이 될 것입니다. 왜 이것이 멀티 스레드 방식입니까? – Luaan
보류중인 응답, 즉 전송 된 명령을 취소하기 위해 ManualResetEvent 및 멀티 스레드를 사용하지만 응답을 받기 전에이를 취소 할 수 있어야합니다. (.Net 4.0으로 제한됨) – NubieJ
.NET 4.0에서는 4.5를 사용하기 때문에 비동기 I/O를 사용할 수 있습니다. – Luaan