【发布时间】:2011-08-12 14:18:40
【问题描述】:
我对 System.Timers.Timer 对象有疑问。我使用计时器对象定期执行任务。在计时器构造函数中,我调用执行工作的方法( DoTimeCheck() ),以确保任务在启动时也运行一次。工作(定期)在 BackgroundWorker 中完成。
我用这个来调用计时器:
UpdaterTimer ut = UpdaterTimer.UpdaterTimerInstance;
我的问题是我需要将任务的第一次运行延迟 3 分钟(在应用程序启动时运行的那个)。后续运行(Elapsed 事件)应立即运行。我想通过调用来做到这一点
System.Threading.Thread.Sleep(TimeToDelayFirstRunInMiliseconds);
但这失败了,因为它还会挂起应用程序的 UI(主线程),使其无法使用。如何在不挂起 UI 的情况下延迟 DoTimeCheck() 的第一次运行? 定时器的代码如下。如果问题没有以清晰的方式呈现,请告诉我,我会编辑。提前谢谢你。
public sealed class UpdaterTimer : Timer
{
private static readonly UpdaterTimer _timer = new UpdaterTimer();
public static UpdaterTimer UpdaterTimerInstance
{
get { return _timer; }
}
static UpdaterTimer()
{
_timer.AutoReset = true;
_timer.Interval = Utils.TimeBetweenChecksInMiliseconds;
_timer.Elapsed += new ElapsedEventHandler(_timer_Elapsed);
_timer.Start();
DoTimeCheck();
}
static void _timer_Elapsed(object sender, ElapsedEventArgs e)
{
DoTimeCheck();
}
private static void DoTimeCheck()
{
//... work here
}
}
【问题讨论】:
-
全班都这样吗? (只是对使用所有静态方法从 Timer 继承感到好奇)
-
感谢您的评论 - 除了 DoTimeCheck() 中的代码之外,这是相关的整个类。所有的静态都应该确保只运行一个计时器——一个单例。当然,这可能不是从 System.Timers.Timer 继承的最佳方式(我是新手),但到目前为止它已经奏效了。