Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows phone 7 倒计时计时器在随机点停止_Windows Phone 7_Timer_Countdowntimer_Dispatchertimer - Fatal编程技术网

Windows phone 7 倒计时计时器在随机点停止

Windows phone 7 倒计时计时器在随机点停止,windows-phone-7,timer,countdowntimer,dispatchertimer,Windows Phone 7,Timer,Countdowntimer,Dispatchertimer,我有一个应用程序,需要多个倒计时运行(一些同时运行)。它们还使用倒计时的剩余时间更新UI元素。我尝试过使用Dispatchermer,因为它是与UI元素交互的简单方式。然而,经过300秒的倒计时,它变得与实时不同步(因为大量的UI更新),以至于我在计时器上剩下30秒,而它应该是0 然后我尝试切换到System.Threading.Timer(下面的代码)。现在,计时器已与现实生活中的时间同步。但是,计时器在随机数的滴答声(3秒到60秒之间)后停止滴答声。我怀疑可能是垃圾收集器启动了,或者是调用(

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

然后我尝试切换到System.Threading.Timer(下面的代码)。现在,计时器已与现实生活中的时间同步。但是,计时器在随机数的滴答声(3秒到60秒之间)后停止滴答声。我怀疑可能是垃圾收集器启动了,或者是调用(用于更新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();
 }

这件事发生在我写的一篇文章中。计时器最终会停止,调试进程时发现线程已被垃圾回收。有人建议我设置.IsBackground=true属性可以解决这个问题。最后我做了一些不同的事情,所以我没有机会尝试这个。不过,这可能会对你有所帮助。

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

考虑以下代码:

    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();

    }
private static DateTime EndTime{get;set;}
私有无效按钮\u单击(对象发送者,路由目标e)
{
Dispatchermer dt=新Dispatchermer();
dt.Interval=从秒开始的时间跨度(.1);
dt.勾选+=(s,evt)=>
{
var remaining=EndTime-DateTime.Now;
timeRemaining.Text=string.Format(“{0:0.0}”,剩余的.TotalSeconds);
如果(剩余的0.5秒)