所以大概你想每秒更新一次显示,以获得这个倒计时?但是,如果我理解的话,出于某种原因,您想将所有内容延迟 3 秒。
如果您希望事情比当前发生的时间晚 3 秒,那么显而易见的解决方案是对计时器进行编程,以便在您真正想要它时调用您:
private DispatcherTimer t = new DispatcherTimer();
private int Counter = 120;
public MainPage()
{
InitializeComponent();
t.Interval = TimeSpan.FromSeconds(4);
t.Tick += timer_Tick;
t.Start();
}
private void timer_Tick(object sender, object o)
{
t.Interval = TimeSpan.FromSeconds(1);
Time.Text = string.Format("{0}:{1}", (Counter / 60), (Counter % 60).ToString().PadLeft(2, ' '));
Counter--;
}
这使得第一个滴答需要 4 秒才能到达,然后将间隔调整为 1 秒。所以你会得到间隔 1 秒的刻度,但一切都会比其他情况晚 3 秒发生。(如果最初将滴答间隔设置为 1,那么第一个滴答需要 1 秒才能到达,这就是为什么您最初需要延迟 4 秒 - 初始滴答 3 只会延迟 2 秒。)
但是,如果您需要立即执行某些操作,并且需要延迟执行某些操作,那么一种明显的方法就是将处理程序中的计数调整 3 秒:
private const int LevelMaxTime = 120;
private DispatcherTimer t = new DispatcherTimer();
private int Counter = LevelMaxTime;
public MainPage()
{
InitializeComponent();
t.Interval = TimeSpan.FromSeconds(1);
t.Tick += timer_Tick;
t.Start();
}
private void timer_Tick(object sender, object o)
{
// Do the undelayed work here, whatever that is...
// Next, we do the delayed work, if there is any yet.
int effectiveCount = Counter + 3;
if (effectiveCount <= LevelMaxTime)
{
Time.Text = string.Format("{0}:{1}", (effectiveCount / 60), (effectiveCount % 60).ToString().PadLeft(2, ' '));
}
Counter--;
}
这只需要有效的当前时间比实际时间早 3 秒Current
,从而将所有内容延迟 3 秒。
你可以做一些更像你的原始代码的事情:
private async void timer_Tick(object sender, object o)
{
// Wait for 3 seconds...for some reason
await Task.Delay(TimeSpan.FromSeconds(3));
Time.Text = string.Format("{0}:{1}", (Counter / 60), (Counter % 60).ToString().PadLeft(2, ' '));
Counter--;
}
这在精神上更接近你所写的(据我所知),只有它有效,但它似乎不必要地令人费解。为什么不让定时器在正确的时间给你打电话,而不是在错误的时间得到回调然后试图补偿呢?这是一个计时器。当你告诉它时它会打电话给你!