/// <summary> /// Long polling wait loop, incoming requests are slept until timeout or a new message /// </summary> /// <param name="topic">Message topic</param> /// <param name="endDateTime">Ending time of sleep operation</param> /// <param name="lastReceivedMsgDT">UTC DateTime value of the last send message</param> /// <returns></returns> private List <PushMessage> Internal_HandleRequest(string topic, DateTime endDateTime, DateTime?lastReceivedMsgDT) { lock (_waitHandleTransitionLock) { // Waitfor proper _waitHandle transition to avoid stackoverflow } var messages = _persistanceService.Get(topic, lastReceivedMsgDT); if ((messages != null) && (messages.Count > 0)) { return(messages); } else { int remaingWaitMiliseconds = (int)endDateTime.Subtract(DateTime.UtcNow).TotalMilliseconds; if (remaingWaitMiliseconds == 0) { return(_persistanceService.Get(topic, lastReceivedMsgDT)); } else if (remaingWaitMiliseconds < 0) { return(new List <DTOs.PushMessage>()); } // Wait for any signal _waitHandle.WaitOne(remaingWaitMiliseconds); return(Internal_HandleRequest(topic, endDateTime, lastReceivedMsgDT)); } }