Я смотрю на создание кода, который все мои службы 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 (), не будет продолжать свою собственную функцию в качестве моего запуска. никогда не вернется.
Как я могу заставить свой класс пульса запускаться и запускаться в фоновом режиме, до тех пор, пока служба не будет прервана / остановлена, в то время как использование кода в моей службе продолжит свое выполнение?