[英]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.