public ResponsePdu WaitResponse(RequestPdu pdu, int timeOut) { uint sequenceNumber = pdu.Header.SequenceNumber; ResponsePdu resp = FetchResponse(sequenceNumber); if (resp != null) { return(resp); } if (timeOut < 5000) { timeOut = _vDefaultResponseTimeout; } PduWaitContext waitContext = new PduWaitContext(sequenceNumber, timeOut); _vWaitingEvent.WaitOne(); try { _vWaitingQueue.Add(waitContext); } finally { _vWaitingEvent.Set(); } waitContext.WaitForAlert(); resp = FetchResponse(sequenceNumber); if (resp == null) { throw new SmppResponseTimedOutException(); } return(resp); }
public void Handle(ResponsePdu pdu) { AddResponse(pdu); _vWaitingEvent.WaitOne(); try { uint sequenceNumber = pdu.Header.SequenceNumber; for (int index = 0; index < _vWaitingQueue.Count; ++index) { PduWaitContext waitContext = _vWaitingQueue[index]; if (waitContext.SequenceNumber == sequenceNumber) { _vWaitingQueue.RemoveAt(index); waitContext.AlertResponseReceived(); if (waitContext.TimedOut) { FetchResponse(sequenceNumber); } return; } } } finally { _vWaitingEvent.Set(); } }