Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 计时器只执行一次_C#_Multithreading_Timer - Fatal编程技术网

C# 计时器只执行一次

C# 计时器只执行一次,c#,multithreading,timer,C#,Multithreading,Timer,我有一个UCMA控制台应用程序,我希望它通过将当前时间戳写入数据库来报告“我还活着”信号。为此,我使用计时器: public static void Main(string[] args) { Random r = new Random(); System.Threading.TimerCallback TimerDelegate = new System.Threading.TimerCallback(TimerCallBack); Timer TimerItem = ne

我有一个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) {}

在那个问题中,投票结果较高的答案都有与您相同的错误。
TimerItem
变量不足以防止计时器对象被垃圾回收。将其存储在静态字段中,或将GC.KeepAlive(TimerItem)放在Main()方法的末尾。谢谢,能否将其作为答案,以便我可以标记它?不幸的是,从长远来看,它并没有解决问题:是的,它确实运行,但在几次事件之后,计时器仍然会停止:(