为什么计时器不能在Windows服务中运行?

时间:2012-10-20 07:07:30

标签: c# windows-services

我知道这是一个已被问到的问题,但我找不到任何解决方案。这是我的服务。

class Program : ServiceBase
{
    private  Timer _timer;
    public Program()
    {
        ServiceName = "PrintTime";
    }

    static void Main(string[] args)
    {
        Run(new Program());
    }

    protected override void OnStart(string[] args)
    {
        base.OnStart(args);
        _timer = new Timer(5000);
        _timer.Elapsed += _timer_Elapsed;
        _timer.Start();
    }

    void _timer_Elapsed(object sender, ElapsedEventArgs e)
    {
        WriteTimeToFile();
    }

    protected override void OnStop()
    {
        _timer.Stop();
    }

    private void WriteTimeToFile()
    {
        using (FileStream fs = new FileStream(@"d:\mylog.txt", FileMode.Append,            FileAccess.ReadWrite))
        {
            StreamWriter streamWriter = new StreamWriter(fs);
            streamWriter.Write(DateTime.Now.ToShortTimeString());
            streamWriter.Close();
            fs.Close();
        }
    }

}

正如您所看到的,我希望每5秒将currentTime写入Mylog.txt文件,但即使是2分钟也没有任何反应。如果我将WriteTimeToFile()函数放入OnStart方法,它可以正常工作,但不能在计时器中使用。

非常感谢任何帮助。

4 个答案:

答案 0 :(得分:5)

计时器的名称空间是什么?它必须是System.Timers.TimerSystem.Threading.Timer

见这里:Best Timer for using in a Windows service

答案 1 :(得分:1)

好的,几个小时后,我注意到计时器工作正常。计时器没有任何问题。但问题是关于FileStream构造函数。 FileMode.Append仅适用于FileAccess.Write

因此修复这行代码解决了这个问题。

无论如何,感谢您的关注。

using (FileStream fs = new FileStream(@"d:\mylog.txt", 
                       FileMode.Append, FileAccess.Write))

答案 2 :(得分:0)

服务必须在具有写入D:\目录的权限的Windows帐户下运行。

检查事件查看器中的异常,以查看是否存在未经授权的访问异常。

还在_timer_Elapsed方法中设置了一个断点,以验证它是否被调用并逐步执行代码。

答案 3 :(得分:0)

Windows service with timer

在这篇文章中阅读我的答案......

也许你错过了     timer.AutoReset = true;