保持窗口服务

时间:2014-04-02 19:48:17

标签: c# windows-services

我的代码是: 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();
    }
}

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

1 个答案:

答案 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);
    }
}