我正在尝试在Windows服务中使用计时器。该服务能够启动和停止,并且当发生这种情况时我会在事件日志中写入内容,这是有效的。我的问题是我还想使用一个持续运行的计时器,并在每次触发timeElapsed事件时向事件日志写入内容。
编辑:(我更改了代码,因此计时器是一个字段,但仍然不是我期望的结果,事件日志中没有日志条目)
using System.Timers;
初始化服务:
public Timer timer;
public MonitorService()
{
InitializeComponent();
timer = new Timer(10000);
//Some code that really doesn't matter
}
启动时事件
protected override void OnStart(string[] args)
{
// Hook up the Elapsed event for the timer.
timer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
timer.Enabled = true;
timer.Start();
EventLogger.WriteEntry("Biztalk monitoring service started", EventLogEntryType.SuccessAudit);
// If the timer is declared in a long-running method, use
// KeepAlive to prevent garbage collection from occurring
// before the method ends.
// GC.KeepAlive(timer);
}
private int count =0;
定时活动: (这是行不通的,每隔10秒没有写入事件日志的条目,而我希望它可以这样做)
// Specify what you want to happen when the Elapsed event is
// raised.
private void OnTimedEvent(object source, ElapsedEventArgs e)
{
//Some other code that doesn't mather
count++;
EventLogger.WriteEntry(string.Format("TimerEvent has ran {0} times. Total time is: {1}", count, e.SignalTime), EventLogEntryType.Information);
}
停止事件:
protected override void OnStop()
{
EventLogger.WriteEntry("Biztalk monitoring service stopped", EventLogEntryType.Warning);
}
主要
对于那些怀疑这是我在Program.cs中的主要方法的人:
///<summary>
///The main entry point for the application.
///</summary>
static void Main()
{
var servicesToRun = new ServiceBase[]
{
new MonitorService()
};
ServiceBase.Run(servicesToRun);
}
已经问到了吗?确实是的!
我知道这个问题之前已经提到了这个问题:Windows service with timer AND Best Timer for using in a Windows service
但这些解决方案似乎并没有解决我的问题。
欢迎任何建议!
答案 0 :(得分:5)
您的计时器是OnStart方法的本地计时器。它不应该。它应该是服务类的一个字段,因此您不需要使用提示欺骗垃圾收集器。
编辑:
您没有指定using
。请确保使用Timer
,使用System.Timers.Timer,不 System.Windows.Forms.Timer
。
答案 1 :(得分:0)
如果您想在一段时间后将某些内容记录到事件日志(除了您正在使用的定时器的已用事件中执行的操作)之外,您可以在服务级别使用另一个计时器并注册其已过去的事件。在那种情况下,您可以记录您想要的任何内容。
如nvoigt所述,您也应将此计时器移至服务级别。