private async Task UpdateLastStateEntry(HostsRepository hostsrepo, HostStatesRepository staterepo, EventRepository eventrepo, CancellationToken stoppingToken)
        {
            var hosts = await hostsrepo.GetAllActive();

            await hosts.ForEachAsync(10, async (host) =>
            {
                await UpdateSingleHostStateEntry(hostsrepo, staterepo, eventrepo, host);
            });
        }
        private async Task CreateStateEntries(HostsRepository hostsrepo, HostStatesRepository staterepo)
        {
            var states = (await hostsrepo.GetAllActive())
                         .Select(x => new HostState {
                HostId = x.Id
            });

            staterepo.Add(states);
        }
        private async Task UpdateSingleHostStateEntry(HostsRepository hostsrepo, HostStatesRepository staterepo, EventRepository eventrepo, Data.Host host)
        {
            _logger.LogTrace($"Checking host {host.Name} ({host.Hostname})");

            var state = staterepo.GetForHost(host.Id)
                        .Last();

            var ping = new Ping();

            try
            {
                var reply = await ping.SendPingAsync(host.Hostname, 2000);

                switch (reply.Status)
                {
                case IPStatus.Success:
                    state.Delay = (int)reply.RoundtripTime;
                    switch (reply.RoundtripTime)
                    {
                    case long n when n < 70:
                        state.Status = HostState.StatusEnum.Online;
                        break;

                    case long n when n < 300:
                        state.Status = HostState.StatusEnum.Warning;
                        break;

                    case long n when n < 2000:
                        state.Status = HostState.StatusEnum.Critical;
                        break;

                    default:
                        state.Status = HostState.StatusEnum.Error;
                        break;
                    }

                    await eventrepo.Enqueue(new HostOnlineEvent { HostId = host.Id });

                    break;

                case IPStatus.TimedOut:
                    state.Status = HostState.StatusEnum.Offline;
                    await eventrepo.Enqueue(new HostOfflineEvent { HostId = host.Id });

                    break;

                default:
                    _logger.LogError($"Unknown IPStatus {reply.Status} while checking {host.Hostname}");
                    state.Status = HostState.StatusEnum.Error;
                    break;
                }
            }
            catch (Exception)
            {
                _logger.LogWarning($"Error while checking {host.Name} ({host.Hostname})");
                state.Status = HostState.StatusEnum.Error;
            }
            finally
            {
                _logger.LogTrace($"Check complete for host {host.Name} ({host.Hostname})");
            }
        }