保持窗口服务实时
本文关键字:实时 服务 窗口 | 更新日期: 2023-09-27 17:56:10
我的代码是:公共分部类 主服务 : 服务基础 { 公共主服务() {
InitializeComponent();
}
private void timer1_Tick(object sender, System.EventArgs e)
{
TextWriter file = new StreamWriter("C:''logfile.txt", true);
file.WriteLine("CPU Usage : " + System.DateTime.Now);
file.Close();
}
protected override void OnStart(string[] args)
{
timer1.Enabled = false;
TextWriter file = new StreamWriter("C:''logfile.txt", true);
file.WriteLine("Service Started");
file.Close();
timer1.Interval = 1000;
timer1.Tick+=new EventHandler(timer1_Tick);
timer1.Enabled = true;
timer1.Start();
}
protected override void OnStop()
{
TextWriter file = new StreamWriter("C:''logfile.txt", true);
file.WriteLine("Service Restarted");
file.Close();
}
protected override void OnContinue()
{
TextWriter file = new StreamWriter("C:''logfile.txt", true);
file.WriteLine("Service stopped");
file.Close();
}
}
代码每一秒写入系统的时间。但它只运行两次(在 OnStart
和 OnStop
上)。如何保持活力?谁向我解释窗口服务的生命圈
问题是您正在使用System.Windows.Forms.Timer
. 此特定组件适用于需要执行某些处理的 UI 线程。 Windows 服务没有 UI 线程,因此这是错误的计时器选择。 更具体地说,问题是 Windows 服务没有 UI 消息泵,因此永远不会处理 Tick
事件。 将System.Windows.Forms.Timer
替换为System.Timers.Timer
将获得预期的结果(见下文)。
给你一些建议。
- 除非您每次要写入文件时都迫切需要打开和关闭文件,否则我建议您将
System.IO.TextWriter
设置为类变量,在OnStart()
中打开文件,然后在OnStop()
中关闭它。 - 例如,如果要在
OnStart()
中调用System.Diagnostics.Debugger.Launch()
,则在启动服务时,系统会提示你跳转到调试会话。 这将允许您在进行时调试内容。 - 停止服务时不会发生
OnContinue()
回调。 当服务在暂停后恢复时,就会发生这种情况。 因此,您的消息不合适。 "服务已停止"消息应记录在OnStop()
方法中。 在实践中,我认为不需要实现暂停/恢复功能,因此您可以考虑在您的服务中是否真的需要它。
关于代码...
public partial class Service1 : ServiceBase
{
System.Timers.Timer timer = new System.Timers.Timer();
System.IO.TextWriter file;
public Service1()
{
// Uncomment this line to launch the debugger when starting the service.
//System.Diagnostics.Debugger.Launch();
InitializeComponent();
}
protected override void OnStart(string[] args)
{
file = new StreamWriter("C:''logfile.txt", true);
file.WriteLine("Service Started");
timer.AutoReset = true;
timer.Interval = 1000;
timer.Elapsed += OnTimerElapsed;
timer.Start();
}
protected override void OnStop()
{
timer.Stop();
timer.Dispose();
file.WriteLine("Service Stopped");
file.Close();
}
private void OnTimerElapsed(object sender, System.Timers.ElapsedEventArgs e)
{
file.WriteLine("CPU Usage : " + System.DateTime.Now);
}
}