Exemple #1
0
        /// <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);
        }
Exemple #2
0
        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);
        }