System.Timers.Timer 为什么不响应了

时间:2022-07-13 20:38:03
/// <summary>
/// 在指定的时间唤醒指定的程序
/// </summary>
public class Planner:IDisposable
{
private GOA.Interface.IPlanalbe _plan = null;
private string tag;
private DateTime settingTime;
private System.Timers.Timer timer = null;
/// <summary>
/// 唤醒器
/// </summary>
/// <param name="timeExpression">时间表达式,定义在什么时候唤醒</param>
/// <param name="plan">需要唤醒的程序</param>
public Planner(string timeExpression , GOA.Interface.IPlanalbe plan)
{
tag = timeExpression.Trim();
_plan = plan;
InitTimer();
}
private void InitTimer()
{
timer = new System.Timers.Timer(200);
SetNotifyTime(DateTime.Now);
timer.Elapsed +=new System.Timers.ElapsedEventHandler(timer_Elapsed);
timer.AutoReset = true;
timer.Start();
}
private void SetNotifyTime(DateTime dt)
{
string[] t = tag.Split(':');
//System.Windows.Forms.MessageBox.Show(this.tag);
int hour = int.Parse(t[0]);
int min = int.Parse(t[1]);

settingTime = new DateTime(dt.Year,dt.Month,dt.Day,hour,min,0);
if(settingTime < DateTime.Now)
{
settingTime = settingTime.AddDays(1);
}
}

private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
if(settingTime.ToShortDateString() == DateTime.Now.ToShortDateString() && settingTime.ToShortTimeString() == DateTime.Now.ToShortTimeString())
{
try
{
Utils.SystemUtil.DebugLog("Planner::timer_Elapsed::Begin");
timer.AutoReset = false;
timer.Stop();
Utils.SystemUtil.DebugLog("Planner::timer_Elapsed::1");
_plan.Action();
Utils.SystemUtil.DebugLog("Planner::timer_Elapsed::2");
}
finally
{
SetNotifyTime(DateTime.Now.AddDays(1));
timer.AutoReset = true;
timer.Start();
}
Utils.SystemUtil.DebugLog("Planner::timer_Elapsed::End");
}
}
#region IDisposable 成员

public void Dispose()
{
Utils.SystemUtil.DebugLog("Planner::Dispose::Begin");
if(timer != null)
{
Utils.SystemUtil.DebugLog("Planner::Dispose::IN");

timer.Stop();
timer.Dispose();
}
Utils.SystemUtil.DebugLog("Planner::Dispose::End");

}

#endregion
}
这个程序是被设计用来,在服务端,每天定时执行功能的,程序运行马上进行调试,跟踪地点问题也没有,但是运行的时间长了再在timer_Elapsed里面加断点,就没有响应了
在Dispose里加断点和日志输出,一点问题也没有

23 个解决方案

#1


@_@

#2


帮顶

#3


release有问题么?

#4


可以打log看看。

#5


release和debug好像都不行

#6


log全都正常,也没有任何异常发生,最后的Dispose 也没有问题
忘了说了,我在一个服务里,用了两个这个计时器的实例,应该没有影响吧

#7


怎么用Planner的?
注意Planner实例的生存期,如果Planner实例被回收,timer也会被回收


#8


怎么用Planner的?
注意Planner实例的生存期,如果Planner实例被回收,timer也会被回收
这个问题,我也考虑了,用我是这样用的
public class TimeLimitObserver:GOA.Interface.IPlanalbe
{
private static TimeLimitObserver instance = null;
/// <summary>
/// 实例
/// </summary>
public static TimeLimitObserver Instance
{
get
{
if(instance == null)
{
instance = new TimeLimitObserver();
}
return instance;
}
}

private Planner _planer = null;
public void Stop()
{
if(_planer != null)
{
_planer.Dispose();
}
}
protected TimeLimitObserver()
{

}
public void Startup()
{
Utils.SystemUtil.DebugLog("TimeLimitObserver::Start");
GOA.Entity.System.Setting setting = new BLL.System.SettingDAO().GetSettingByKey("SETTING","NOTIFYSERVICE","LIMITTIME");
Utils.SystemUtil.DebugLog(setting.Value1);
_planer = new Planner(setting.Value1,this);
}
#region IPlanalbe 成员

public void Action()
调用者用了一个单件模式,是一个static类型的变量,保证了生存周期

其次,Planner实现了Dispose接口,我在Dispose里加了日志输出,但是没有任何输出
第三,Planner无法响应之后,我用断点跟踪了private Planner _planer 是有值的
而且Planner里的timer也是有值的

#9


你是什么服务???
windows 服务??
web服务???
还是别的,运行在什么环境下??

#10


第三,Planner无法响应之后,我用断点跟踪了private Planner _planer 是有值的
而且Planner里的timer也是有值的
我在Dispose里加的断点,然后结束服务,断点相应
而在 timer_Elapsed里加断点,就无法相应

我用了两个Planner实例,都是这样

#11


windows 服务,运行在windows 2003 sp1上

#12


服务的run() 
InitializeLifetimeService()
代码??

#13


InitializeLifetimeService()
---
这个没有,应该怎么写呢

#14


太长了,没心情看

#15


private System.Timers.Timer timer = null;
timer = new System.Timers.Timer(200);


换成System.Windows.Forms.Timer

#16


长太长。。。。。。

换System.Threading.Timer吧。如果还有问题,那就可以确定不是System.Timers.Timer的问题了。他们实现方法完全不同。
System.Windows.Forms.Timer只能用在winform,它的实质是利用消息循环。

#17


断点没有响应,可能是系统中断级别的原因。
调试windows服务程序,一般采用输出文本文件log的方式。
既然,输出的log已经正确,说明你的程序正常了,不需要再断点调试了。:)

#18


断点没有相应的部分就是出问题的部分,
那部分是一个if语句,我在if语句上加断点,没有响应
这个if语句,应该是0.2秒触发一次,如果条件成立的话,就会记日志,但是也没有记下来
其他的地方,断点可以断下来,日志也没有问题

#19


在多线程的情况下有可能会出现这种情况

#20


up

#21


我也有做过定时导数据的程序

我是用一个定时器每秒去判断 是否到了定时的时间。

#22


问题解决了,用www_123du_com(鼠·神·泪) 说的System.Threading.Timer
或者,自己用Thread写,都可以
但是,用System.Timers.Timer 就是不行,不知道为什么
先结贴了

#23


你看看System.Timers.Timer中在MSDN的介绍,它好像是利用一个系统服务来进行的(不确定,但确实是系统实现的,而非.NET本身),所以有可能是系统环境问题。

#1


@_@

#2


帮顶

#3


release有问题么?

#4


可以打log看看。

#5


release和debug好像都不行

#6


log全都正常,也没有任何异常发生,最后的Dispose 也没有问题
忘了说了,我在一个服务里,用了两个这个计时器的实例,应该没有影响吧

#7


怎么用Planner的?
注意Planner实例的生存期,如果Planner实例被回收,timer也会被回收


#8


怎么用Planner的?
注意Planner实例的生存期,如果Planner实例被回收,timer也会被回收
这个问题,我也考虑了,用我是这样用的
public class TimeLimitObserver:GOA.Interface.IPlanalbe
{
private static TimeLimitObserver instance = null;
/// <summary>
/// 实例
/// </summary>
public static TimeLimitObserver Instance
{
get
{
if(instance == null)
{
instance = new TimeLimitObserver();
}
return instance;
}
}

private Planner _planer = null;
public void Stop()
{
if(_planer != null)
{
_planer.Dispose();
}
}
protected TimeLimitObserver()
{

}
public void Startup()
{
Utils.SystemUtil.DebugLog("TimeLimitObserver::Start");
GOA.Entity.System.Setting setting = new BLL.System.SettingDAO().GetSettingByKey("SETTING","NOTIFYSERVICE","LIMITTIME");
Utils.SystemUtil.DebugLog(setting.Value1);
_planer = new Planner(setting.Value1,this);
}
#region IPlanalbe 成员

public void Action()
调用者用了一个单件模式,是一个static类型的变量,保证了生存周期

其次,Planner实现了Dispose接口,我在Dispose里加了日志输出,但是没有任何输出
第三,Planner无法响应之后,我用断点跟踪了private Planner _planer 是有值的
而且Planner里的timer也是有值的

#9


你是什么服务???
windows 服务??
web服务???
还是别的,运行在什么环境下??

#10


第三,Planner无法响应之后,我用断点跟踪了private Planner _planer 是有值的
而且Planner里的timer也是有值的
我在Dispose里加的断点,然后结束服务,断点相应
而在 timer_Elapsed里加断点,就无法相应

我用了两个Planner实例,都是这样

#11


windows 服务,运行在windows 2003 sp1上

#12


服务的run() 
InitializeLifetimeService()
代码??

#13


InitializeLifetimeService()
---
这个没有,应该怎么写呢

#14


太长了,没心情看

#15


private System.Timers.Timer timer = null;
timer = new System.Timers.Timer(200);


换成System.Windows.Forms.Timer

#16


长太长。。。。。。

换System.Threading.Timer吧。如果还有问题,那就可以确定不是System.Timers.Timer的问题了。他们实现方法完全不同。
System.Windows.Forms.Timer只能用在winform,它的实质是利用消息循环。

#17


断点没有响应,可能是系统中断级别的原因。
调试windows服务程序,一般采用输出文本文件log的方式。
既然,输出的log已经正确,说明你的程序正常了,不需要再断点调试了。:)

#18


断点没有相应的部分就是出问题的部分,
那部分是一个if语句,我在if语句上加断点,没有响应
这个if语句,应该是0.2秒触发一次,如果条件成立的话,就会记日志,但是也没有记下来
其他的地方,断点可以断下来,日志也没有问题

#19


在多线程的情况下有可能会出现这种情况

#20


up

#21


我也有做过定时导数据的程序

我是用一个定时器每秒去判断 是否到了定时的时间。

#22


问题解决了,用www_123du_com(鼠·神·泪) 说的System.Threading.Timer
或者,自己用Thread写,都可以
但是,用System.Timers.Timer 就是不行,不知道为什么
先结贴了

#23


你看看System.Timers.Timer中在MSDN的介绍,它好像是利用一个系统服务来进行的(不确定,但确实是系统实现的,而非.NET本身),所以有可能是系统环境问题。