private void CheckServices(DateTime currentTime) { if (IsCheckInProgress()) { return; } try { List <ServiceCheckerContainer> targetContainers = _serviceCheckers. Where(x => currentTime >= x.NextCheckTime).ToList(); if (targetContainers.Count > 0) { Task.Factory.StartNew(() => { try { Parallel.ForEach(targetContainers, x => { CheckResult r = x.Checker.Check(); DateTime nextCheckTime = DateTime.Now.AddSeconds(x.ServiceDef.Period); logger.Info("Service " + x.ServiceDef.GetFullName() + ": " + r.GetText() + System.Environment.NewLine + "Next check time: " + nextCheckTime); try { _outputService.Write(DateTime.UtcNow, x.ServiceDef, r).ContinueWith(t => { if (t.Exception != null) { logger.Error(t.Exception, "Output task error for service " + x.ServiceDef.GetFullName() + ": " + t.Exception.ToString()); } else { logger.Error("Output task error for service " + x.ServiceDef.GetFullName() + " (detailed info is missed)"); } }, TaskContinuationOptions.OnlyOnFaulted); } catch (Exception ex) { logger.Error(ex, "Output error for service " + x.ServiceDef.GetFullName() + ": " + ex.Message); } x.NextCheckTime = nextCheckTime; }); } catch (Exception ex) { logger.Error(ex, "Parallel.ForEach exception: " + ex.Message); } finally { _checkComplete.Set(); } }); } else { _checkComplete.Set(); } } catch (Exception) { _checkComplete.Set(); throw; } }