代码之家  ›  专栏  ›  技术社区  ›  pdemarest

倒数计时器后如何添加延迟

  •  0
  • pdemarest  · 技术社区  · 15 年前

    我正在使用 DispatcherTimer 在触发相机释放之前执行倒计时。这个 UpdateCountdown 方法用于在相机触发前更改显示给用户的图像。而不是 TakePicture 方法立即执行,我希望在计数器达到零并显示最后一个图像后稍有延迟。

    下面显示的代码导致在 _countdown = 1 点。当最终图像显示和 TakePicture() 几乎同时开火(我想 拍摄照片 先发生)。

    _countdownTimer = new DispatcherTimer();
    _countdownTimer.Interval = TimeSpan.FromSeconds(1);
    _countdownTimer.Tick += new EventHandler(delegate(object s, EventArgs a)
         { UpdateCountdown(); } );
    
    _countdownTimer.Tick += new EventHandler(delegate(object s, EventArgs a)
         {if (_countdown == _countdownMax)
            {
                System.Threading.Thread.Sleep(2000);  // Slight delay before taking picture
                Camera.TakePicture();
            } });
        }
    
    public void StartCountdown()
    {
        if (doCount)
        {
            doCount = false;
            UpdateCountdown();
            _countdownTimer.Start();
        }
    }
    
    private void UpdateCountdown()
    {
        _countdown--;
        CountdownImage = _countDownImages[_countdown]; // Data bound to Image Control
    
         if (_countdown == 0)
         {
           _countdown = _countdownMax;
           _countdownTimer.Stop();
           doCount = true;
          }
    

    我不考虑我的时间安排吗?

    3 回复  |  直到 13 年前
        1
  •  2
  •   Nir    15 年前

    当您更改控件属性时,UI不会立即更新-它只在线程空闲时更新(即,在所有事件处理程序完成执行之后)。

    sleep阻塞线程,事件处理程序没有完成执行,UI没有重新绘制。

    您必须使用另一个计时器(在现有计时器的最后一个刻度上启动一个新计时器,并在新计时器的刻度上调用TakePicture),或者更好的做法是,在以下情况下使用现有计时器的最后一个刻度-更新用户界面: (_countdown <= _countdownMax) ,拍照时间 (_countdown == _countdownMax + 1) .

        2
  •  1
  •   Josh    15 年前

    为什么不让你的显示总是比剩余秒数少1秒呢?这样一来,当你达到零的时候,(显然是用一个math.max(0,_countdown)来防止显示-1),即使还有一秒钟的时间,时间似乎也会用完。

    编辑:我的意思是,但没有说明——你当时可以 勾选处理程序,根本不使用sleep,它最终只会阻塞UI,这可能会阻止您的UI更新。

        3
  •  0
  •   Anton    15 年前

    我认为事件不能保证事件处理程序按注册顺序触发。尝试

    _countdownTimer.Tick += new EventHandler(delegate(object s, EventArgs a)     
    {
            UpdateCountdown();
            if (_countdown == _countdownMax)
            {
                System.Threading.Thread.Sleep(2000);  // Slight delay before taking picture
                Camera.TakePicture();
            }
          });
        }
    
    推荐文章