예제 #1
0
        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);
        }
예제 #2
0
 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(); }
 }