我有一个需要多个倒计时器运行的应用程序(有些同时运行)。他们还使用倒计时剩余时间更新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();
}
答案 0 :(得分:2)
不要数。将当前时间与计时器的开始时间进行比较,并进行数学运算。这样,即使你在这里错过了半秒,你仍然可以准时出现。
考虑以下代码:
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();
}
答案 1 :(得分:0)
这件事发生在我正在写的服务上。计时器最终会停止,调试进程发现线程已被垃圾收集。有人建议我设置.IsBackground = true属性可以解决这个问题。我最后做了一些不同的事情,所以我没有机会尝试这个。它可能对你有帮助。