延迟窗口8 app倒数计时器c#

时间:2013-08-09 05:34:23

标签: c# xaml windows-8 timer countdown

我有一个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);}}

所以我把异步放在那里因为我认为我应该等待Task.Delay(3000);在计数器延迟计时器但它不起作用。我不想使用WinRT Xaml工具包倒计时器,因为我不希望那里有动画。

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

1 个答案:

答案 0 :(得分: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--;
}

这只需要有效当前时间为Current所说的3秒之前的时间,从而将所有内容延迟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--;
}

这与你所写的内容(据我所知)更接近,只有它有效,但它似乎不必要地复杂化。为什么不编程定时器在正确的时间给你打电话,而不是在错误的时间收到回调然后试图补偿?这是一个计时器。当你告诉它时它会打电话给你!