Мониторинг задачи в фоновом режиме - PullRequest
0 голосов
/ 01 мая 2018

Я смотрю на создание кода, который все мои службы Windows будут использовать для записи «сердцебиения» в таблицу базы данных, чтобы позволить мне создать приложение montior для повышения осведомленности о том, когда служба не работает.

Для этого я создал проект ServiceHeartbeat с единственным классом Heartbeat, чтобы найти мою запись сервиса в базе данных, и добавил таймер для выполнения каждую минуту, например:

/// <summary>
/// Class to perform the registering of a services' "heartbeat"
/// </summary>
public class Heartbeat
{
    private readonly string _serviceName;
    private IService _service;
    private readonly IServiceRepository _serviceRepository;
    private readonly Timer _timer = new Timer();
    private bool continueBeating = true;

    /// <summary>
    /// Constructor
    /// </summary>
    public Heartbeat(string serviceName)
        :this(new ServiceRepository(new ConnectionFactory()))
    {
        _serviceName = serviceName;
    }

    internal Heartbeat(IServiceRepository serviceRepository)
    {
        _serviceRepository = serviceRepository;
    }


    public async Task<IService> GetSvc(string serviceName)
    {
        var svc = await _serviceRepository.FindByServiceNameAsync(_serviceName);

        return svc;
    }

    /// <summary>
    /// Begin inserting heartbeat record into monitor database
    /// </summary>
    public void Start()
    {
        try
        {
            _service = _serviceRepository.FindByServiceNameAsync(_serviceName).Result;
            if (_service != null)
            {
                _timer.Interval = _service.HeartbeatIntervalMins * 60 * 1000;
                _timer.Enabled = true;
                _timer.AutoReset = true;
                _timer.Elapsed += (sender, args) =>
                {
                    RegisterHeartbeat();
                };
                _timer.Start();
                while (continueBeating)
                {

                }
            }
        }
        catch (Exception ex)
        {
            _timer.Dispose();
        }
    }

    /// <summary>
    /// Stop registering service heartbeat in monitor database
    /// </summary>
    public void Stop()
    {
        continueBeating = false;
        _timer?.Dispose();
    }

    private void RegisterHeartbeat()
    {
        _serviceRepository.RegisterHeartbeat(_service.Id);
    }
}

Это обновление интересующей меня записи, но из-за моего оператора While (continueBeating) я блокирую поток, поэтому любая служба, которая сообщает мой класс Heartbeat и вызывает Start (), не будет продолжать свою собственную функцию в качестве моего запуска. никогда не вернется.

Как я могу заставить свой класс пульса запускаться и запускаться в фоновом режиме, до тех пор, пока служба не будет прервана / остановлена, в то время как использование кода в моей службе продолжит свое выполнение?

...