如何暂停系统.Visual Basic中的定时器



我正在使用一个系统。在Windows服务中运行一个通常超过定时器间隔的进程。我试图阻止计时器多次触发相同的代码,这是system.timers的已知问题。

我想要的:计时器运行我的代码,但计时器"暂停"等待,直到代码完成后才恢复滴答。

我有两个问题:

  1. 方式系统。计时器的工作原理是,计时器将通过启动相同代码的新冗余线程来创建一个竞争条件,如果在计时器的间隔时间内尚未完成,则将它们堆积在您身上。

  2. 我会启动/停止定时器,以防止这种情况发生,但与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.
      }
}

最新更新