C# 后台监控任务
我正在研究创建代码,我的所有windows服务都将使用该代码向数据库表写入“心跳信号”,以允许我创建一个montior应用程序,以提高服务未启动时的意识 为此,我创建了一个ServiceHeartbeat项目,其中包含一个类Heartbeat,用于在数据库中查找我的服务记录,并添加了一个计时器,以便每分钟执行一次,如下所示: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" //
/// <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提供的运行状况支持。计时器是因为我在开发时添加了一个“测试线束”控制台应用程序项目来调用,并且在启动返回时就完成了。已将我的等待条件移动到控制台应用程序中并正常工作。干杯