private void DoMonitor() { DateTime lastCheck = DateTime.Now; bool firstBeat = false; while (!token.IsCancellationRequested) { //If task is faulted CheckTaskFault(longRunTask, ref longRunFault); if (longRunFault != null && !longRunFault.Recovered && DateTime.Now > longRunFault.FaultTime + new TimeSpan(0, 0, Convert.ToInt16(Math.Pow(2, longRunFault.FaultCount)) * 10)) { longRunTask = Task.Run(() => DoLongRun(), token); longRunFault.Recovered = true; } DateTime newCheck = DateTime.Now; if (!firstBeat || newCheck - lastCheck > heartBeatPeriod) { firstBeat = true; lastCheck = newCheck; string basepaths; List <QMSite> sites = GetSites(out basepaths); if (sites != null) { foreach (QMSite site in sites) { string sXML = BuildProductInfoString(site); try { using (var qm = new QueueManager(sXML)) { qm.AddHeartBeat(); } } catch (Exception ex) { ExceptionHandler("MonitorThread, Site: " + site.basePath, ex); } } } } Thread.Sleep(doMonitorPeriod); } }