private void OnTimeoutCallback(object state) { var haveTimeoutMessages = false; timeoutMessageIds.Read(reader => haveTimeoutMessages = reader.HasAnyBefore(CurrentTime)); if (!haveTimeoutMessages) { return; } timeoutMessageIds.Write(writer => { KeyValuePair <DateTime, List <string> > pair; while (writer.TryRemoveFirstUntil(CurrentTime, out pair)) { if (pair.Key > CurrentTime) { return; } foreach (string messageId in pair.Value) { Uri queueUri = null; try { using (var queue = parentTransport.CreateQueue()) using (var tx = new TransactionScope()) { queueUri = queue.RootUri; logger.DebugFormat("Moving message {0} to main queue: {1}", messageId, queueUri); queueStrategy.MoveTimeoutToMainQueue(queue, messageId); tx.Complete(); } } catch (InvalidOperationException) { logger.DebugFormat("Could not move message {0} to main queue: {1}", messageId, queueUri); if ((CurrentTime - pair.Key).TotalMinutes >= 1.0D) { logger.DebugFormat("Tried to send message {0} for over a minute, giving up", messageId); continue; } writer.Add(pair.Key, messageId); logger.DebugFormat("Will retry moving message {0} to main queue {1} in 1 second", messageId, queueUri); } catch (Exception e) { logger.Error("Could not move message " + messageId + " from timeout queue", e); } } } }); }