我有一个用c#编写的Windows服务.它内部有一个计时器,可以定期激活一些功能.所以我服务的骨架:
public partial class ArchiveService : ServiceBase
{
Timer tickTack;
int interval = 10;
...
protected override void OnStart(string[] args)
{
tickTack = new Timer(1000 * interval);
tickTack.Elapsed += new ElapsedEventHandler(tickTack_Elapsed);
tickTack.Start();
}
protected override void OnStop()
{
tickTack.Stop();
}
private void tickTack_Elapsed(object sender, ElapsedEventArgs e)
{
...
}
}
Run Code Online (Sandbox Code Playgroud)
它工作了一段时间(如10-15天)然后停止.我的意思是服务显示为正在运行,但它没有做任何事情.我做了一些日志记录,问题可能是计时器,因为在间隔之后它不会调用tickTack_Elapsed函数.
我正在考虑在没有计时器的情况下使用无限循环重写它,这会在我设置的时间内停止处理.这也不是一个优雅的解决方案,我认为它可能会对内存产生一些副作用.
Timer是从System.Timers命名空间使用的,环境是Windows 2003.我在不同服务器上的两个不同服务中使用这种方法,但两者都产生了这种行为(这就是为什么我认为它以某种方式连接到我的代码或框架本身).
有人经历过这种行为吗?有什么不对?
我编辑了这两项服务.一个人到处都有一个不错的尝试和更多的记录.第二个定期进行定时娱乐.他们都没有停止过,所以如果这种情况再持续一周,我会关闭这个问题.到目前为止,感谢大家.
我关闭了这个问题因为什么都没发生 我的意思是我做了一些更改,但这些更改在这个问题上并不真正相关,而且从那时起这两个服务都没有任何问题.请将其标记为"已关闭且不再相关".
我的程序需要一个计时器.我写了它,它在仿真器程序(Android 1.5/2.2)中的PC上工作正常.但它不适用于真实设备(Android 1.5).我究竟做错了什么?
TimerTask task = new TimerTask() {
public void run() {
if (condition) {
myFunc();
} else {
this.cancel();
}
}
};
Timer timer = new Timer();
timer.schedule(task, 500, 85);
Run Code Online (Sandbox Code Playgroud) 在JavaScript中单调增加时间的最佳方法是什么?我希望有类似Java的东西System.nanoTime().
Date() 显然不会起作用,因为它受系统时间变化的影响.
换句话说,我想要的是<= b,总是:
a = myIncreasingTime.getMilliseconds();
...
// some time later, maybe seconds, maybe days
b = myIncreasingTime.getMilliseconds();
Run Code Online (Sandbox Code Playgroud)
充其量,即使在使用UTC函数时Date(),它也会返回它认为正确的时间,但如果有人向后设置时间,则下一次调用Date()可以返回较小的值.System.nanoTime()不受此限制(至少在系统重新启动之前).
修改: [2012-02-26:无意影响原始问题,具有赏金]
我不知道"壁挂时间",我有兴趣知道经过的时间有一定的准确性,这Date()是无法提供的.
我试图理解何时System.Timers.Timer引发已经过去的事件,它是在一个独立的线程中引发的?
我的下面的例子似乎暗示三个计时器在他们自己的线程中独立运行:
class Program
{
static System.Timers.Timer timer = new System.Timers.Timer();
static System.Timers.Timer timer2 = new System.Timers.Timer();
static System.Timers.Timer timer3 = new System.Timers.Timer();
static void Main(string[] args)
{
timer.Elapsed += new System.Timers.ElapsedEventHandler(
timer_Elapsed);
timer2.Elapsed += new System.Timers.ElapsedEventHandler(
timer2_Elapsed);
timer3.Elapsed += new System.Timers.ElapsedEventHandler(
timer3_Elapsed);
timer.Interval = 1000;
timer2.Interval = 1000;
timer3.Interval = 1000;
timer.Start();
timer2.Start();
timer3.Start();
Console.WriteLine("Press \'q\' to quit the sample.");
while (Console.Read() != 'q') ;
}
static void timer3_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
timer3.Stop();
Console.WriteLine("Timer 3 Hit..."); …Run Code Online (Sandbox Code Playgroud) 是否System.currentTimeMillis总是返回的值固定的长度.在我的Windows Core2中,它返回一个13位长的值.
从其API:
以毫秒为单位返回当前时间.请注意,虽然返回值的时间单位是毫秒,但值的粒度取决于底层操作系统,并且可能更大.例如,许多操作系统以几十毫秒为单位测量时间.
受到最后一个闰秒的启发,我一直在探索使用POSIX调用的计时(特别是间隔计时器).
POSIX提供了几种设置计时器的方法,但它们都有问题:
sleep并且nanosleep这些在被信号中断后重新启动很烦人,并引入了时钟偏差.您可以通过一些额外的工作来避免一些但不是全部的这种偏差,但这些功能使用实时时钟,所以这并非没有陷阱.setitimer或者更现代的timer_settime这些被设计为间隔计时器,但它们是每个进程,如果您需要多个活动计时器,这是一个问题.它们也不能同步使用,但这不是什么大问题.clock_gettime并且clock_nanosleep在使用时看起来像是正确的答案CLOCK_MONOTONIC.clock_nanosleep支持绝对超时,因此您可以只是睡眠,增加超时,然后重复.在中断之后也很容易重启.不幸的是,这些功能可能也是特定于Linux的:在Mac OS X或FreeBSD上不支持它们.pthread_cond_timedwait可以在Mac上使用,可以gettimeofday作为一个kludgy解决方案,但在Mac上它只能与实时时钟一起使用,因此当系统时钟设置或闰秒发生时,它会受到不当行为的影响.我缺少一个API吗?是否有一种合理的可移植方式在类UNIX系统上创建性能良好的间隔定时器,或者这总结了今天的状态?
通过良好的行为和合理的便携性,我的意思是:
关于闰秒的注释(响应R ..的回答):
POSIX天的长度恰好是86,400秒,但现实世界的日子很少会更长或更短.系统如何解决这种差异是由实现定义的,但闰秒通常与前一秒共享相同的UNIX时间戳.另请参见:闰秒以及如何处理它们.
Linux内核闰第二个错误是在将时钟设置为秒后无法进行内务处理的结果:https://lkml.org/lkml/2012/7/1/203.即使没有那个错误,时钟也会向后跳一秒钟.
我有一个负责做一些过程的线程.我希望这样做,以便这些处理每3秒完成一次.我已经使用了下面的代码,但是当线程启动时,没有任何反应.我假设当我为我的计时器定义一个任务时,它会ScheduledTask在一个时间间隔内自动执行,但它根本不做任何事情.我错过了什么?
class temperatureUp extends Thread
{
@Override
public void run()
{
TimerTask increaseTemperature = new TimerTask(){
public void run() {
try {
//do the processing
} catch (InterruptedException ex) {}
}
};
Timer increaserTimer = new Timer("MyTimer");
increaserTimer.schedule(increaseTemperature, 3000);
}
};
Run Code Online (Sandbox Code Playgroud) 我的Android应用程序中有一个动画,它会闪烁TextView不同的颜色.我使用了TimerTask,Timer和Runnable方法来实现它.我需要做的是在用户在onPause()期间离开应用程序时停止线程,并在用户返回onResume()中的应用程序时恢复线程.以下是我实现的代码,但它不起作用(onPause()和onResume()件),我不明白为什么.我已经阅读了其他类似问题的其他帖子,但他们没有帮我弄清楚在我的情况下该怎么做.我已经读过TimerTasks已经过时了,我应该使用ExecutorService方法; 我不清楚如何实现这个功能.
...timerStep5 = new TimerTask() {
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
if (b5) {
cashButton2SignalText.setBackgroundColor(Color.RED);
cashButton2SignalText.setTextColor(Color.WHITE);
b5=false;
} else {
cashButton2SignalText.setBackgroundColor(Color.WHITE);
cashButton2SignalText.setTextColor(Color.RED);
b5=true;
}
}
});
}
};
timer5.schedule(timerStep5,250,250);
}
public void onPause(){
super.onPause();
timerStep5.cancel();
}
public void onResume(){
super.onResume();
timerStep5.run();
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个代码,使用javafx以预定但不规则的间隔在屏幕上显示内容.我试图使用一个计时器(java.util,而不是javax.swing),但事实证明,如果你是从一个单独的线程工作,你不能改变应用程序中的任何东西.(像一个计时器)任何人都可以告诉我我怎么能如果它们都是单独的线程,那么让Timer与应用程序进行交互?
我想编写一个服务来轮询数据库并根据被带回的数据执行操作.
我不确定这样做的最佳方式是什么,我可以找到一些关于它的博客和这个堆栈溢出问题轮询服务 - C#.但是我很谨慎他们都很老了,可能已经过时了.
任何人都可以告诉我目前的建议或最佳实践(如果有的话)做这样的事情或指向我最近的博客文章的方向.从我可以使用计时器或tpl任务收集的是两种可能的方法.
如果仍然建议定时器,那么当服务停止时它们将如何工作,因为我打算让这些服务执行的操作可能需要30多分钟,这就是为什么我说使用任务因为我可以使用任务取消令牌但这些抛出取消时的异常(如果我错了,请纠正我)并且我不认为我真的想要那种行为(尽管如果你认为我有理由我会这样做,请纠正我).
对不起,我在一个问题上可能会问很多,但我不能完全确定自己在问什么.