C# 后台监控任务

C# 后台监控任务,c#,asynchronous,timer,task,background-process,C#,Asynchronous,Timer,Task,Background Process,我正在研究创建代码,我的所有windows服务都将使用该代码向数据库表写入“心跳信号”,以允许我创建一个montior应用程序,以提高服务未启动时的意识 为此,我创建了一个ServiceHeartbeat项目,其中包含一个类Heartbeat,用于在数据库中查找我的服务记录,并添加了一个计时器,以便每分钟执行一次,如下所示: /// <summary> /// Class to perform the registering of a services' "heartbeat" //

我正在研究创建代码,我的所有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);
    }
}
//
///类来执行服务“心跳”的注册
/// 
公共类心跳
{
私有只读字符串_serviceName;
私人电视服务;
专用只读存储库(serviceRepository);
专用只读计时器_Timer=new Timer();
private bool continueBeating=真;
/// 
///建造师
/// 
公共检测信号(字符串serviceName)
:此(新的ServiceRepository(新的ConnectionFactory()))
{
_serviceName=serviceName;
}
内部检测信号(IServiceRepository serviceRepository)
{
_serviceRepository=serviceRepository;
}
公共异步任务GetSvc(字符串serviceName)
{
var svc=await _serviceRepository.FindByServiceNameAsync(_serviceName);
返回svc;
}
/// 
///开始将心跳记录插入监视器数据库
/// 
公开作废开始()
{
尝试
{
_服务=\u serviceRepository.FindByServiceNameAsync(\u serviceName).Result;
如果(_服务!=null)
{
_timer.Interval=_service.HeartbeatIntervalMins*60*1000;
_timer.Enabled=true;
_timer.AutoReset=true;
_计时器运行时间+=(发送方,参数)=>
{
RegisterHeartbeat();
};
_timer.Start();
同时(继续行走)
{
}
}
}
捕获(例外情况除外)
{
_timer.Dispose();
}
}
/// 
///停止在监视器数据库中注册服务检测信号
/// 
公共停车场()
{
continueBeating=false;
_计时器?.Dispose();
}
私有无效注册表HeartBeat()
{
_serviceRepository.RegisterHeartbeat(_service.Id);
}
}
这是在更新我感兴趣的记录,但由于我的While(continueBeating)语句,我阻止了线程,因此任何更新我的Heartbeat类并调用Start()的服务都不会继续使用它自己的功能,因为我的Start永远不会返回


如何使心跳类在后台反复启动和运行,直到服务出现故障/停止,同时使用服务中的代码继续执行?

为什么有循环和计时器?windows服务也有windowsNice one提供的运行状况支持。计时器是因为我在开发时添加了一个“测试线束”控制台应用程序项目来调用,并且在启动返回时就完成了。已将我的等待条件移动到控制台应用程序中并正常工作。干杯