【发布时间】:2011-08-17 14:37:46
【问题描述】:
我有一个用 C# 编写的 Windows 服务,可以正确执行一个方法。我添加了一个计时器来安排方法执行,它似乎没有触发 ElapsedEventHandler 事件。
System.Timers.Timer timer = new System.Timers.Timer();
public LabelService()
{
InitializeComponent();
timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
}
public void SetTimer()
{
DateTime nextRunTime = GetNextRunTime();
var ts = nextRunTime - DateTime.Now;
timer.Interval = ts.TotalMilliseconds;
timer.AutoReset = false;
timer.Start();
}
void timer_Elapsed(object source, ElapsedEventArgs e)
{
// ** never gets here **
timer.Stop();
// run some code
SetTimer();
}
我可以运行并在timer.Start(); 处打断点,所以我知道这已经完成,但它永远不会落入 timer_Elapsed 方法。 (为了测试,我将 ts.TotalMilliseconds 更改为 1000)有什么想法吗?
【问题讨论】:
-
我尝试将 timer.Interval 和 timer.AutoReset 移出 SetTimer() 并且没有变化。
-
您能详细介绍一下您的课程和周边代码吗?这段代码是否有可能在计时器启动之前从内存中卸载的东西中运行?如果对象不再存在,则事件不会触发...
-
当然。我的课程基本上就是我在上面发布的内容,以及一些不会产生任何效果的辅助方法。它与计时器有关,因为如果我直接从 OnStart() 或 Main() 调用 timer_Elapsed 它执行得很好。我一直打断点直到 timer.Start() 所以调试工作正常。我错过了一些东西......我的课程是:公共部分类 LabelService:ServiceBase。我认为这看起来是正确的?
-
您是否完全确定事件处理程序实际上已连接到事件?只是为了好玩,尝试移动 timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);进入你的 SetTimer() 方法,然后 timer.Elapsed -= new ElapsedEventHandler(timer_Elapsed);就在处理程序中的 timer.Stop() 之后。只是看看你能不能参加这个活动......
-
Jim - 刚刚尝试了您的建议,但在 timer.Start() 之后没有任何反应。我可以在那里放置一个断点。它退出 SetTimer() 并且没有其他任何事情发生。我在 timer_Elapsed 最开始放置的任何测试代码都不会被命中。我很确定我正确地添加了处理程序,方法是输入 timer.Elapsed += 并点击两次 tab 来创建处理程序。