public void Start(int pollIntervalInSeconds, IDataAccess dal, ILogger logger) { while (true) { try { var batch = dal.DequeueTransform(); if (batch.Count > 0) { var docsToUpsert = new Dictionary<string, string> (); foreach (var rootId in batch) { var allRows = dal.GetRows (rootId); JObject finalDoc = CombineRows (rootId, allRows); if (finalDoc != null) { finalDoc ["_transformed_on"] = DateTime.Now; string doc = JsonConvert.SerializeObject (finalDoc); docsToUpsert.Add (rootId, doc); } } dal.UpsertDocuments(docsToUpsert); logger.WriteLine ("Transformed {0}...", batch.Count); } else { Thread.Sleep (pollIntervalInSeconds * 1000); } _backoff = 1; } catch (Exception ex) { if (_backoff < 5) { _backoff++; } logger.WriteLine (ex.ToString ()); Debug.WriteLine (ex.ToString ()); Thread.Sleep (_backoff * 1000); } } }