private async Task <int> Dequeue(IEnumerable <byte> buffer, int maxNumberOfMessageToDequeue) { KVAnswer answer; KVParsingStatus answerStatus; int dequeuedMessageCount = 0; int dequeuedBytesCount = 0; while (true) { try { // we build as many answers as we can answerStatus = KVAnswer.TryParse(buffer, ByteBuffer.Count, out answer); if (answerStatus == KVParsingStatus.Valid) { dequeuedMessageCount += 1; dequeuedBytesCount += answer.MessageLength; ByteBuffer.Dequeue(answer.MessageLength); // throw the answer await OnKVAnswerReceived(answer); // test for max message to dequeue if (maxNumberOfMessageToDequeue > 0 && dequeuedMessageCount >= maxNumberOfMessageToDequeue) { Debug.WriteLine("The maximum number of messages to dequeue has been reached"); break; } } else { if (answerStatus == KVParsingStatus.Empty) { // the stream is corrupted : dequeue all zeros ByteBuffer.Clean(); } break; } } catch (Exception ex) { Debug.Write(ex.Message); throw; } } return(dequeuedBytesCount); }
private Task OnKVAnswerReceived(KVAnswer answer) { KVReply reply; if (ReplyQueue.TryRemove(answer.Id, out reply)) { reply.SetAnswer(answer, chrono); Logger.Log(LogLevel.Debug, "<< query dequeue : id={0}, len={1}, mode={2}, tm={3}", answer.Id, answer.MessageLength, answer.Mode, reply.RoundTripTime.TotalMilliseconds); if (reply.Callback != null) { return(reply.Callback.Invoke(reply)); } } else { Logger.Log(LogLevel.Warn, "the answer was not paired with a query"); } return(Task.CompletedTask); }
internal void SetAnswer(KVAnswer answer, Stopwatch chrono) { RoundTripTime = TimeSpan.FromMilliseconds((double)(chrono.ElapsedMilliseconds - msElapsed_start)); Answer = answer; }