protected async Task SendTotal(RunningTotal total, string location) { }
protected async override Task ExecuteAsync(CancellationToken stoppingToken) { bool queueEmpty = false; var delayString = configurationPackage.Settings.Sections["Timing"] .Parameters["MessageMaxDelaySeconds"].Value; var delay = int.Parse(delayString); var filter = await IdempotencyFilter.NewIdempotencyFilterAsync( "logMessages", delay, stateManager); var store = await stateManager.GetOrAddAsync <IReliableDictionary <string, RunningTotal> >("partialCount"); while (!stoppingToken.IsCancellationRequested) { while (!queueEmpty && !stoppingToken.IsCancellationRequested) { RunningTotal finalDayTotal = null; using (ITransaction tx = stateManager.CreateTransaction()) { var result = await queue.TryDequeueAsync(tx); if (!result.HasValue) { queueEmpty = true; } else { var item = await filter.NewMessage <PurchaseInfo>(result.Value); if (item != null) { var counter = await store.TryGetValueAsync(tx, item.Location); var newCounter = counter.HasValue ? new RunningTotal { Count = counter.Value.Count, Day = counter.Value.Day } : new RunningTotal(); finalDayTotal = newCounter.Update(item.Time, item.Cost); if (counter.HasValue) { await store.TryUpdateAsync(tx, item.Location, newCounter, counter.Value); } else { await store.TryAddAsync(tx, item.Location, newCounter); } } await tx.CommitAsync(); if (finalDayTotal != null) { await SendTotal(finalDayTotal, item.Location); } } } } await Task.Delay(100, stoppingToken); queueEmpty = false; } }