倒计时计时器在随机点停止



我有一个应用程序,它需要多个倒计时计时器才能运行(有些同时运行)。它们还使用倒计时的剩余时间更新UI元素。我尝试过使用DispatcherTimer,因为它是与UI元素交互的简单方法。然而,在300秒的倒计时中,它与实时不同步(因为UI更新量很大),以至于我的计时器还剩30秒,而它本应为0。

然后我尝试切换到System.Threading.Timer(下面的代码)。现在,计时器是即时的,并与现实生活中的时间同步。但是,计时器在随机数目的刻度(在3秒到60秒之间)后停止计时。我怀疑要么是垃圾收集器启动,要么是Invoke(用于更新UI),但我并不知道如何继续沿着这条路走下去。有人能告诉我为什么计时器会随机停止吗?

private int counter = 500;    
private void btnTopBlue_Click(object sender, RoutedEventArgs e)
{
    btnTopBlue.Content = counter.ToString();
    Timer dt = new Timer(topBlue_Tick, null, 1000, 1000);
}
private void topBlue_Tick(object sender)
{
     if (counter > 0)
     {
         counter--;
         Dispatcher.BeginInvoke(() => btnTopBlue.Content = counter.ToString());    
     }
     else
         ((Timer)sender).Dispose();
 }

不要计数。将当前时间与计时器的开始时间进行比较,然后计算。这样,即使你在这里错过了半秒,在那里错过了半秒钟,你仍然会准时到达。

考虑这个代码:

    private static DateTime EndTime { get; set; }
    private void Button_Click(object sender, RoutedEventArgs e)
    {
        DispatcherTimer dt = new DispatcherTimer();
        dt.Interval = TimeSpan.FromSeconds(.1);

        dt.Tick += (s, evt) =>
                       {
                           var remaining = EndTime - DateTime.Now;
                           timeRemaining.Text = string.Format("{0:0.0}", remaining.TotalSeconds);
                           if(remaining.TotalSeconds <= 0)
                           {
                               dt.Stop();
                           }
                       };
        EndTime = DateTime.Now + TimeSpan.FromSeconds(30);
        dt.Start();
    }

我在编写服务时遇到了这种情况。计时器最终会停止,并且调试进程发现线程已被垃圾收集。有人建议我设置.IsBackground=true属性可以解决这个问题。我最终做了一些不同的事情,所以我没有机会尝试这个。不过它可能会对你有所帮助。

最新更新