我的代码是: public partial class MainService:ServiceBase { public MainService() {
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
)。如何保持生活?谁向我解释窗口服务的生命周期
答案 0 :(得分:1)
问题是您使用的是System.Windows.Forms.Timer
。此特定组件适用于需要进行某些处理的UI线程。 Windows服务没有UI线程,因此这是计时器的错误选择。更具体地说,问题是Windows服务没有UI消息泵,因此永远不会处理Tick
事件。用System.Windows.Forms.Timer
替换System.Timers.Timer
将为您提供预期的结果(见下文)。
为您提供一些建议。
System.IO.TextWriter
作为类变量,在OnStart()
中打开文件,然后关闭它在OnStop()
。System.Diagnostics.Debugger.Launch()
中拨打OnStart()
,则在启动服务时系统会提示您跳转到调试会话。这将允许您在移动时调试内容。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);
}
}