保持窗口服务实时

本文关键字:实时 服务 窗口 | 更新日期: 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();
    }
}

代码每一秒写入系统的时间。但它只运行两次(在 OnStartOnStop 上)。如何保持活力?谁向我解释窗口服务的生命圈

保持窗口服务实时

问题是您正在使用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);
    }
}