/// <summary> /// Observes single connector. Creates asynchronous loop. /// </summary> /// <param name="connector">Connector to observe.</param> /// <param name="token">Cancellation token passed to connector.</param> /// <remarks>See https://blogs.msdn.microsoft.com/benwilli/2016/06/30/asynchronous-infinite-loops-instead-of-timers/ for look idea description.</remarks> /// <returns>Not used.</returns> private async Task StartObserveSingle(ObservationConnector connector, CancellationToken token) { while (connector.Running) { try { if (DateTime.Now - connector.LastPoll > connector.Interval) { log.Log(LogLevel.Trace, "Observation of {@connector} started.", connector); connector.LastPoll = DateTime.Now; await connector.Connector.QueryStatus(token); if (connector.Running) { this.StatusQueried?.Invoke(this, connector.Connector); } log.Log(LogLevel.Trace, "Observation of {@connector} ended.", connector); } var remainingOfInterval = connector.Interval - (DateTime.Now - connector.LastPoll); if (remainingOfInterval.TotalMilliseconds > 0 && connector.Running) { int milisecondsToWait = remainingOfInterval.TotalMilliseconds < int.MaxValue ? (int)remainingOfInterval.TotalMilliseconds : int.MaxValue; await Task.Delay(milisecondsToWait, token); } } catch (Exception e) { log.Error(e, "Exception occurred when observing connector {connector}", new { Interval = connector.Interval, Name = connector.Connector.ConnectorConfiguration.Name, CurrentStatus = connector.Connector.CurrentStatus }); } } log.Log(LogLevel.Debug, "Exiting observation loop for {@connector}.", connector); }
public void Observe(Connector connector, int interval = DefaultPollInterval) { if (connector == null) { return; } if (this.observedConnectors.Any(s => s.Connector.Equals(connector))) { // connector is already being observed log.Warn("Connector {connector} is already being observed, skip adding.", new { Interval = interval, Name = connector.ConnectorConfiguration.Name, CurrentStatus = connector.CurrentStatus }); return; } var observationConnector = new ObservationConnector(connector, interval); this.observedConnectors.Add(observationConnector); log.Log(LogLevel.Debug, "Observation connector {@connector} added.", observationConnector); }