我正在使用一个系统。在Windows服务中运行一个通常超过定时器间隔的进程。我试图阻止计时器多次触发相同的代码,这是system.timers的已知问题。
我想要的:计时器运行我的代码,但计时器"暂停"等待,直到代码完成后才恢复滴答。
我有两个问题:
-
方式系统。计时器的工作原理是,计时器将通过启动相同代码的新冗余线程来创建一个竞争条件,如果在计时器的间隔时间内尚未完成,则将它们堆积在您身上。
-
我会启动/停止定时器,以防止这种情况发生,但与System.Timers。计时器,一旦你停止计时器处理完成,它永远不会回来-我从来没有能够重新启动一个计时器,一旦它已经停止,它已经被销毁,并可能收集。启用/禁用与启动/停止完全相同,结果相同。
你到底是如何保持一个系统的。定时器从启动新的冗余线程的相同的代码,如果进程没有完成的时间定时器的间隔已经失效?显然,启动/停止(启用/禁用)定时器不是一个解决方案,因为它不起作用。
帮助!
在计时器需要启动时启动它,启动另一个线程来完成计时器可以停止的工作。计时器不会关心线程是否完成或跑掉了奖金。使用任务并行库(TPL)以获得最有效的用途。
Timer的Start和Stop方法确实在Windows服务中工作。我有多个生产服务使用这样的代码,除了我的代码是用c#编写的。
但是,请确保使用的是System.Timers。计时器和不是的 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.
}
}