Принимая во внимание, что очередь «первым пришел - первым вышел», вы должны предположить, что все сообщения, которые находятся в очереди, поступают в момент времени, равный или более поздний, чем время первого сообщения в очереди.
Вы можете использовать это в своих интересах.
По сути, вы вызываете метод Peek в своем экземпляре MessageQueue и смотрите на свойство ArrivedTime. Если время между текущим временем и временем прибытия превышает 20 минут, вы обработаете его, в противном случае вы продолжите ждать (до следующей обработки сообщений в очереди).
Вот пример:
static Message GetQueueMessage(MessageQueue queue)
{
// Store the current time.
DateTime now = DateTime.Now;
// Get the message on top of the queue.
Message message = queue.Peek();
// If the current time is greater than or equal to 20 minutes, then process it,
// otherwise, get out and return false. Generate 20 minutes first.
// You can refactor this to have it passed in.
TimeSpan delay = TimeSpan.FromMinutes(20);
// If the delay is greater than the arrived time and now, then get out.
if (delay > (now - message.ArrivedTime))
{
// Return null.
return null;
}
// Pop the message from the queue to remove it.
return queue.ReceiveById(message.Id);
}
Затем вы можете запустить это в цикле, ожидая немного между (каждые пять секунд, десять, независимо от того, что вы считаете подходящим для частоты обработки):
// Have some other reasonable check here.
do while (true)
{
// The message to process.
Message message = GetQueueMessage(queue);
// Continue to process while there is a message.
do while (message != null)
{
// Process the message.
// Get the next message.
message = GetQueueMessage(queue);
}
// Wait a little bit, five seconds for example.
Thread.Sleep(5000);
}
В идеале, основываясь на комментарии Чарльза Конвея , вы не будете обрабатывать это в цикле, а просто вызовете GetQueueMessage из обработчика событий по таймеру, который будет срабатывать в указанный вами интервал.