【问题标题】:Delay windows 8 app countdown timer c#延迟 windows 8 应用倒数计时器 c#
【发布时间】:2013-08-09 05:34:22
【问题描述】:

我有一个 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 工具包倒计时计时器,因为我不想要那里的动画。

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

【问题讨论】:

  • 我不知道我是否理解你的问题,但是如果你想简单地把特定的时间延迟放在进程线程之间,那么这个sn-p可以帮助await Task.Delay(TimeSpan.FromSeconds(1.5));简单它会考虑秒。让我知道这是否有效..
  • 你在使用DispatcherTimer吗?
  • 调用timer_Tick 函数的计时器是否设置为在关卡时间到期时关闭(例如,它在 60 秒后触发,或其他任何时间),或者计时器是否在您想要更新倒计时的频率(例如,每秒一次)?很难确定您的意图 - 您可以编辑问题的任何机会,因为完全不清楚您所说的“我正在尝试计时器 3 秒”是什么意思?

标签: c# xaml windows-8 timer countdown


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多