【问题标题】:Why is the timer not working in windows service?为什么计时器在 Windows 服务中不起作用?
【发布时间】:2012-10-10 18:30:39
【问题描述】:

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

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 方法中,它可以正常工作,但不能在计时器中。

任何帮助将不胜感激。

【问题讨论】:

  • 通过附加来自 Visual Studio 的进程来调试您的服务。

标签: c# windows-services


【解决方案1】:

计时器的命名空间是什么?它需要是System.Timers.TimerSystem.Threading.Timer

请看这里:Best Timer for using in a Windows service

【讨论】:

  • Elapsed 表示 Timers.Timer
  • 它是 System.Timer.Timer 。但我也尝试过 System.Threading.Timer 。结果相同。
  • 当我使用工具箱插入它时,我有一个 Windows 窗体计时器。我有一次使用工具箱...感谢您的提示!
【解决方案2】:

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

查看事件查看器中的异常,看看是否有未经授权的访问异常。

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

【讨论】:

  • 如果写入 d:\directory 被拒绝,那么为什么将 WriteTimeToFile() 放入 onStart 方法有效?
【解决方案3】:

Windows service with timer

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

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

【讨论】:

    【解决方案4】:

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

    所以修复这行代码解决了这个问题。

    不管怎样,谢谢你的关注。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-28
      • 2020-12-27
      • 2019-10-28
      • 2013-03-28
      • 1970-01-01
      • 2016-02-18
      • 2020-03-23
      相关资源
      最近更新 更多