1

我有一个 Windows 8 游戏应用程序,它为每个级别使用一个计时器,我正在尝试将计时器设置为 3 秒。

我必须启动计时器的代码有效,但我似乎无法延迟计时器,以便我显示单词来倒计时。

这是代码:

private async void timer_Tick(object sender, object e)
        {
            await
                Time.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Low,
                    () =>
                    { Time.Text = string.Format("{0}:{1}", (Counter/60), (Counter%60).ToString().PadLeft(2, ' ')); });
            Counter--;
            await Task.Delay(3000);}}

所以我把 async 放在那里,因为我认为我应该把 await Task.Delay(3000); 在计数器延迟计时器之后,但它不起作用。我不想使用 WinRT Xaml 工具包倒数计时器,因为我不想要那里的动画。

关于我做错了什么的任何建议都会很棒!

4

1 回答 1

2

所以大概你想每秒更新一次显示,以获得这个倒计时?但是,如果我理解的话,出于某种原因,您想将所有内容延迟 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--;
}

这在精神上更接近你所写的(据我所知),只有它有效,但它似乎不必要地令人费解。为什么不让定时器在正确的时间给你打电话,而不是在错误的时间得到回调然后试图补偿呢?这是一个计时器。当你告诉它时它会打电话给你!

于 2013-08-12T16:16:25.230 回答