我在Windows服务中使用system.timer来运行通常超过计时器间隔的进程。我试图让计时器多次触发相同的代码,这是system.timers的一个已知问题。
我想要的是:计时器运行我的代码,但计时器"暂停"等到代码完成后再恢复滴答。
我有两个问题:
system.timers工作的方式是计时器会通过启动相同代码的新冗余线程来为你创建一个竞争条件,如果在计时器和#39时尚未完成,则将它们堆积在你身上; s间隔已经过去。
我会启动/停止计时器以防止这种情况发生,但是使用System.Timers.Timer,一旦你停止计时器以完成处理,它就永远不会回来 - 我从来没有能够一旦计时器停止,就会重新启动它,它已被销毁并可能被收集。启用/禁用与启动/停止相同,结果相同。
如果在计时器的间隔时间过去之前进程尚未完成,那么如何保持system.timer启动相同代码的新冗余线程?显然,启动/停止(启用/禁用)计时器不是解决方案,因为它不起作用。
帮助!
答案 0 :(得分:2)
在需要启动时启动计时器,启动另一个线程以执行工作,之后可以停止计时器。计时器不关心线程是否完成或逃脱了奖金。使用任务并行库(TPL)可以最有效地使用。
答案 1 :(得分:1)
Timer上的Start和Stop方法确实可以在Windows服务中运行。 我有多个使用代码的生产服务,除了我的代码是用C#编写的。
但是,请确保您使用 System.Timers.Timer 和不 Windows.Forms.Timer
以下是我的服务外观的C#/伪代码的快速示例。
// this is the OnStart() event which fires when windows svc is started
private void OnStart()
{
// start your timer here.
MainTimer.Start();
}
private void ElapsedEventHandler()
{
try
{
// Stop the timer, first thing so the problem of another timer
// entering this code does not occur
MainTimer.Stop();
//Do work here...
}
catch (Exception ex)
{
// if you need to handle any exceptions - write to log etc.
}
finally
{
MainTimer.Start();
// finally clause always runs and will insure
// your timer is always restarted.
}
}