C# 计时器只执行一次
我有一个UCMA控制台应用程序,我希望它通过将当前时间戳写入数据库来报告“我还活着”信号。为此,我使用计时器: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
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()方法的末尾。谢谢,能否将其作为答案,以便我可以标记它?不幸的是,从长远来看,它并没有解决问题:是的,它确实运行,但在几次事件之后,计时器仍然会停止:(