windows服务中使用System.Timers.Timer计时器,事件不能触发问题

时间:2022-12-06 20:37:09
如题,在windows服务中使用System.Timers.Timer计时器,设置了Elapsed事件,但事件一直不能被触发。代码如下

private System.Timers.Timer timer;
protected override void OnStart(string[] args)
{
      Thread.Sleep(30000);
      this.timer = new System.Timers.Timer();
      this.timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
      this.timer.Interval = 1000;
      this.timer.AutoReset = true;
      this.timer.Enabled = true;
}
void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
}

15 个解决方案

#1


这部分代码看不出什么问题 应该可以执行到 是不是因为时间是30s 你自己没有注意到呢

#2


引用 1 楼  的回复:
这部分代码看不出什么问题 应该可以执行到 是不是因为时间是30s 你自己没有注意到呢

sleep 30s

#3


引用 2 楼  的回复:
引用 1 楼 的回复:
这部分代码看不出什么问题 应该可以执行到 是不是因为时间是30s 你自己没有注意到呢

sleep 30s

30s是我故意加上去,以便够时间附加进程在VS中调试的。OnStart中的代码断点调试看过没有问题,正常执行。但timer_Elapsed事件没有被触发。

#4


是不是因为没启动呀 timer.start(),我不太懂,不过上次用定时器就是因为忘了写这句

#5


this.timer.AutoReset = true;
貌似触发一次之后就不会再触发了

timer_Elapsed放点东西呢,
不要放 messagebox,而是写个日志文件啥的

#6


this.timer.Enabled = true;
和 timer.start()
效果是一样滴

#7


引用 5 楼  的回复:
this.timer.AutoReset = true;
貌似触发一次之后就不会再触发了

timer_Elapsed放点东西呢,
不要放 messagebox,而是写个日志文件啥的

它现在是连一次都不触发,timer_Elapsed里面有代码,只是我没有贴出来而已。

#8


你调试一下不就行了 

#9


引用 8 楼  的回复:
你调试一下不就行了

就是在调试状态下,发现计时器定时执行的方法没有被执行。

#10


我觉得你重写的那个 onstart 方法都没有执行

#11


你把整个源代码 发上来我给你调试一下

#12


引用 10 楼  的回复:
我觉得你重写的那个 onstart 方法都没有执行

onstart方法有执行,我断点命中了,源码就是这么多了,timer_Elapsed只是做一些输出log的工作,里面的断点没有命中

#13


你的代码我试过 可以执行到timer的事件的 没有问题  要不你就把代码贴过来看看 

this.timer.AutoReset = true;
不是只执行一次 而是间隔执行  false的话是只执行一次

#14


引用 13 楼  的回复:
你的代码我试过 可以执行到timer的事件的 没有问题 要不你就把代码贴过来看看 

this.timer.AutoReset = true;
不是只执行一次 而是间隔执行 false的话是只执行一次

我就需要间隔执行,我是在.net2.0下开发的,服务类型是LocalService和LocalSystem都试过了。代码如下:
private System.Timers.Timer timer;

        public Service()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
            Thread.Sleep(30000);
            this.timer = new System.Timers.Timer(); // 这里断点,能够命中进入调试
            this.timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
            this.timer.Interval = 1000;
            this.timer.AutoReset = true;
            this.timer.Enabled = true;
            //this.timer.Start();
        }

        /// <summary>
        /// 服务停止事件
        /// </summary>
        protected override void OnStop()
        {
            this.timer.Enabled = false;
            //this.timer.Stop();
        }

        void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            Config config = Config.GetConfig();  // 这里断点,没有进入调试

            if (config.Status == Status.Start)
            {
                return;
            }

            Console.Write("OK");
        }

#15


解决了,最后没有用System.Timers.Timer,改用Threading.Timer就可以了。

#1


这部分代码看不出什么问题 应该可以执行到 是不是因为时间是30s 你自己没有注意到呢

#2


引用 1 楼  的回复:
这部分代码看不出什么问题 应该可以执行到 是不是因为时间是30s 你自己没有注意到呢

sleep 30s

#3


引用 2 楼  的回复:
引用 1 楼 的回复:
这部分代码看不出什么问题 应该可以执行到 是不是因为时间是30s 你自己没有注意到呢

sleep 30s

30s是我故意加上去,以便够时间附加进程在VS中调试的。OnStart中的代码断点调试看过没有问题,正常执行。但timer_Elapsed事件没有被触发。

#4


是不是因为没启动呀 timer.start(),我不太懂,不过上次用定时器就是因为忘了写这句

#5


this.timer.AutoReset = true;
貌似触发一次之后就不会再触发了

timer_Elapsed放点东西呢,
不要放 messagebox,而是写个日志文件啥的

#6


this.timer.Enabled = true;
和 timer.start()
效果是一样滴

#7


引用 5 楼  的回复:
this.timer.AutoReset = true;
貌似触发一次之后就不会再触发了

timer_Elapsed放点东西呢,
不要放 messagebox,而是写个日志文件啥的

它现在是连一次都不触发,timer_Elapsed里面有代码,只是我没有贴出来而已。

#8


你调试一下不就行了 

#9


引用 8 楼  的回复:
你调试一下不就行了

就是在调试状态下,发现计时器定时执行的方法没有被执行。

#10


我觉得你重写的那个 onstart 方法都没有执行

#11


你把整个源代码 发上来我给你调试一下

#12


引用 10 楼  的回复:
我觉得你重写的那个 onstart 方法都没有执行

onstart方法有执行,我断点命中了,源码就是这么多了,timer_Elapsed只是做一些输出log的工作,里面的断点没有命中

#13


你的代码我试过 可以执行到timer的事件的 没有问题  要不你就把代码贴过来看看 

this.timer.AutoReset = true;
不是只执行一次 而是间隔执行  false的话是只执行一次

#14


引用 13 楼  的回复:
你的代码我试过 可以执行到timer的事件的 没有问题 要不你就把代码贴过来看看 

this.timer.AutoReset = true;
不是只执行一次 而是间隔执行 false的话是只执行一次

我就需要间隔执行,我是在.net2.0下开发的,服务类型是LocalService和LocalSystem都试过了。代码如下:
private System.Timers.Timer timer;

        public Service()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
            Thread.Sleep(30000);
            this.timer = new System.Timers.Timer(); // 这里断点,能够命中进入调试
            this.timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
            this.timer.Interval = 1000;
            this.timer.AutoReset = true;
            this.timer.Enabled = true;
            //this.timer.Start();
        }

        /// <summary>
        /// 服务停止事件
        /// </summary>
        protected override void OnStop()
        {
            this.timer.Enabled = false;
            //this.timer.Stop();
        }

        void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            Config config = Config.GetConfig();  // 这里断点,没有进入调试

            if (config.Status == Status.Start)
            {
                return;
            }

            Console.Write("OK");
        }

#15


解决了,最后没有用System.Timers.Timer,改用Threading.Timer就可以了。