private async Task DispatchEvents(CancellationToken token) { bool more; do { more = TryDispatchEventBatch(); circuitBreaker.Success(); if (more && !token.IsCancellationRequested) { //if there is more events to dispatch we sleep for a bit and then we go again await Task.Delay(1000, CancellationToken.None).ConfigureAwait(false); } } while (!token.IsCancellationRequested && more); }
void TryProcessMessage(object obj) { var cancellationToken = (CancellationToken)obj; while (!cancellationToken.IsCancellationRequested) { BrokeredMessage brokeredMessage = null; if (pendingMessages.Count > 0) { brokeredMessage = pendingMessages.Dequeue() as BrokeredMessage; } if (brokeredMessage == null) { if (timeToDelayNextPeek < MaximumWaitTimeWhenIdle) { timeToDelayNextPeek += PeekInterval; } Thread.Sleep(timeToDelayNextPeek); continue; } timeToDelayNextPeek = 0; Exception exception = null; // due to clock drift we may receive messages that aren't due yet according to our clock, let's put this back if (brokeredMessage.ScheduledEnqueueTimeUtc > DateTime.UtcNow) { pendingMessages.Enqueue(brokeredMessage); continue; } if (!RenewLockIfNeeded(brokeredMessage)) { continue; } var transportMessage = brokeredMessage.ToTransportMessage(); try { if (settings.IsTransactional) { using (var scope = new TransactionScope(TransactionScopeOption.Required, transactionOptions)) { Transaction.Current.EnlistVolatile(new ReceiveResourceManager(brokeredMessage), EnlistmentOptions.None); if (transportMessage != null) { if (tryProcessMessage(transportMessage)) { scope.Complete(); } } } } else { if (transportMessage != null) { tryProcessMessage(transportMessage); } } circuitBreaker.Success(); } catch (Exception ex) { exception = ex; } finally { if (!cancellationToken.IsCancellationRequested && (transportMessage != null || exception != null)) { endProcessMessage(transportMessage, exception); } } } }