我有一个计时器对象.我想让它每分钟都运行一次.具体来说,它应该运行一个OnCallBack方法,并在OnCallBack方法运行时变为非活动状态.一旦OnCallBack方法完成,它(a OnCallBack)重新启动计时器.
这就是我现在所拥有的:
private static Timer timer;
private static void Main()
{
timer = new Timer(_ => OnCallBack(), null, 0, 1000 * 10); //every 10 seconds
Console.ReadLine();
}
private static void OnCallBack()
{
timer.Change(Timeout.Infinite, Timeout.Infinite); //stops the timer
Thread.Sleep(3000); //doing some long operation
timer.Change(0, 1000 * 10); //restarts the timer
}
Run Code Online (Sandbox Code Playgroud)
但是,似乎没有用.它每3秒运行一次非常快.即使提高了一段时间(1000*10).它似乎对此视而不见1000 * 10
我做错了什么?
我需要创建一些Windows服务,每隔N段执行一次.
问题是:
我应该使用哪个定时器控件:System.Timers.Timer或者System.Threading.Timer一个?它对某些事物有影响吗?
我问,因为我听到许多证据表明System.Timers.TimerWindows服务中的工作不正确.
谢谢.
有三个Timer,我知道的课程,System.Threading.Timer,System.Timers.Timer,和System.Windows.Forms.Timer,但这些都没有一个.Reset()这将当前经过时间重置为0功能.
有没有这个功能的BCL类?这样做有非破解方法吗?(我想也许改变它的时间限制可能会重置它)考虑重新实现Timer具有此功能的类有多难,或者如何使用其中一个BCL类可靠地执行它?
我在这里发现了类似的问题,但没有我满意的答案.所以再次重述这个问题 -
我有一项需要定期完成的任务(比如每隔1分钟).使用Timertask&Timer执行此操作的优势是什么,而不是创建一个具有无限循环睡眠的新线程?
使用timertask-的代码段 -
TimerTask uploadCheckerTimerTask = new TimerTask(){
public void run() {
NewUploadServer.getInstance().checkAndUploadFiles();
}
};
Timer uploadCheckerTimer = new Timer(true);
uploadCheckerTimer.scheduleAtFixedRate(uploadCheckerTimerTask, 0, 60 * 1000);
Run Code Online (Sandbox Code Playgroud)
使用Thread和sleep的代码片段 -
Thread t = new Thread(){
public void run() {
while(true) {
NewUploadServer.getInstance().checkAndUploadFiles();
Thread.sleep(60 * 1000);
}
}
};
t.start();
Run Code Online (Sandbox Code Playgroud)
如果逻辑执行时间超过间隔时间,我真的不必担心是否会错过某些周期.
请评论这个..
更新:
最近我发现使用Timer与Thread.sleep()之间存在另一个区别.假设当前系统时间是上午11:00.如果由于某种原因我们将系统时间回滚到上午10:00,则计时器将停止执行任务,直到它到达上午11:00,而Thread.sleep()方法将继续执行任务而不受阻碍.这可能是决定在这两者之间使用什么的主要决策者.
我正在开发一个Android 2.3.3应用程序,我需要每隔X秒运行一个方法.
在iOS中,我有NSTimer,但在Android中我不知道该使用什么.
有人推荐我Handler ; 另一个推荐我AlarmManager,但我不知道哪种方法更适合NSTimer.
这是我想在Android中实现的代码:
timer2 = [
NSTimer scheduledTimerWithTimeInterval:(1.0f/20.0f)
target:self
selector:@selector(loopTask)
userInfo:nil
repeats:YES
];
timer1 = [
NSTimer scheduledTimerWithTimeInterval:(1.0f/4.0f)
target:self
selector:@selector(isFree)
userInfo:nil
repeats:YES
];
Run Code Online (Sandbox Code Playgroud)
我需要一些像NSTimer一样的东西.
你推荐我什么?
我希望计算API返回值所花费的时间.这种行动所花费的时间是纳秒秒.由于API是C++类/函数,我使用timer.h来计算相同的:
#include <ctime>
#include <cstdio>
using namespace std;
int main(int argc, char** argv) {
clock_t start;
double diff;
start = clock();
diff = ( std::clock() - start ) / (double)CLOCKS_PER_SEC;
cout<<"printf: "<< diff <<'\n';
return 0;
}
Run Code Online (Sandbox Code Playgroud)
上面的代码给出了以秒为单位的时间.如何在毫秒秒内获得相同的精度?
在Windows上,clock()以毫秒为单位返回时间,但是在我正在处理的这个Linux机器上,它将它舍入到最接近的1000,因此精度仅为"秒"级别而不是毫秒级别.
我找到了一个使用QTime该类的Qt解决方案,实例化一个对象并调用start()它然后调用elapsed()以获得经过的毫秒数.
我有点幸运,因为我开始使用Qt,但我想要一个不依赖第三方库的解决方案,
有没有标准的方法来做到这一点?
UPDATE
请不要推荐Boost ..
如果Boost和Qt可以做到这一点,那肯定不是魔术,必须有他们正在使用的标准!
是什么区别between System.Windows.Forms.Timer()和System.Windows.Threading.DispatcherTimer()?在哪些情况下,我们应该使用它们?任何最佳做法?
假设我想每10秒执行一次操作,并不一定需要更新视图.
问题是:使用带有timertask的计时器是否更好(我的意思是更有效率和更有效),如下所示:
final Handler handler = new Handler();
TimerTask timertask = new TimerTask() {
@Override
public void run() {
handler.post(new Runnable() {
public void run() {
<some task>
}
});
}
};
timer = new Timer();
timer.schedule(timertask, 0, 15000);
}
Run Code Online (Sandbox Code Playgroud)
或者只是一个带有postdelayed的处理程序
final Handler handler = new Handler();
final Runnable r = new Runnable()
{
public void run()
{
<some task>
}
};
handler.postDelayed(r, 15000);
Run Code Online (Sandbox Code Playgroud)
如果您能解释何时使用哪种方法以及为什么其中一种方法比另一种方法更有效(如果它实际上是这样),我将不胜感激.
我知道在.NET中有三种计时器类型(请参阅比较.NET Framework类库中的计时器类).我选择了一个线程计时器,因为如果主线程繁忙,其他类型可能会漂移,我需要这个是可靠的.
此计时器在计时器控制中的工作方式是放在另一个线程上,因此它可以随时在父线程不忙时在工作开始时完成.
控制台应用程序中此计时器的问题是,当计时器正在另一个线程上时,主线程没有对应用程序执行任何操作.
我尝试添加while true循环,但是当计时器关闭时主线程太忙了.