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

时间:2009-12-08 04:57:31

标签: c# wpf delay dispatchertimer

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

下面显示的代码导致暂停发生在_countdown = 1点。虽然最终图像显示且TakePicture()几乎同时发生(我认为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 个答案:

答案 0 :(得分:2)

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

Thread.Sleep阻塞线程,事件处理程序没有完成执行,UI也没有重绘。

您必须使用另一个计时器(在现有计时器的最后一个计时器上启动一个新计时器并在新计时器的计时器上调用TakePicture),或者更好的是,使用现有计时器的最后一个计时器 - 在{时更新UI {1}},在(_countdown <= _countdownMax)时拍照。

答案 1 :(得分:1)

为什么不让您的显示屏始终显示比剩余秒数少1个。这样当你达到零时(显然有一个Math.Max(0,_countdown)来阻止显示-1),即使再过一秒,时间似乎已经用完了。

编辑:我的意思是暗示但是没有说明 - 那就是你可以只有一个 Tick处理程序而不是使用Sleep,这最终会阻止UI阻止你的UI更新。

答案 2 :(得分:0)

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

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