繁体   English   中英

计时器仅执行一次

[英]Timer executes only once

我有一个UCMA控制台应用程序,我希望它通过将当前时间戳写入数据库来报告“我还活着”信号。 为此,我使用计时器:

 public static void Main(string[] args)
{
   Random r = new Random();
   System.Threading.TimerCallback TimerDelegate = new System.Threading.TimerCallback(TimerCallBack);
   Timer TimerItem = new Timer(TimerDelegate, null, 0, r.Next(10000, 25000));


   UCMASampleForwardIncomingCall ucmaSampleForwardIncomingCall = new UCMASampleForwardIncomingCall() 
   ucmaSampleForwardIncomingCall.Run();

}

TimerCallBack将数据写入数据库, ucmaSampleForwardIncomingCall是程序的“主要”方法,在此阶段重要的是,在初始配置后,它等待一个事件。 但是上面的代码只执行一次计时器...我正在考虑将ucmaSampleForwardIncomingCall放在单独的线程上:

   public static void Main(string[] args)
{
   Random r = new Random();
   System.Threading.TimerCallback TimerDelegate = new System.Threading.TimerCallback(TimerCallBack);
   Timer TimerItem = new Timer(TimerDelegate, null, 0, r.Next(10000, 25000));
   Thread callThread = new Thread(new ThreadStart(ucmaSampleForwardIncomingCall.Run));
   callThread.Start();

但计时器仍只执行一次。 我已经阅读了“如何设置计时器”主题,但在这里我还是很困惑。

编辑:使用GC.keepAlive(TimerItem)解决了这个问题。

编辑2:是否在少数事件后计时器停止,可能是因为ucmaSampleForwardIncomingCall中捕获了异常

编辑3:目前与以下人员合作:

     public static void Main(string[] args)
    {
     Random r = new Random();
     Timer TimerItem = new Timer(TimerCallBack, null, 0, r.Next(10000, 15000));
      ucmaSampleForwardIncomingCall.Run();
     GC.KeepAlive(TimerItem);
  }

    private static void TimerCallBack(Object o)
    {.... more code.....}

但是我的期望并不很高...

由于信誉低于50:D,我无法评论您的问题,但我认为最好为您的计时器定义一个字段,因为如果回调是静态字段,则它的根对象需要在相同的范围内定义。 代码将是这样,希望对您有所帮助。

private static Timer timer = new Timer();

public static void Main(string[] args)
{
    // timer properties will be set here
    timer.Tick += timer_Tick;
    ucmaSampleForwardIncomingCall.Run();
}

private static void timer_Tick(Object o) {}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM