0

在触发相机上的释放之前,我正在使用 aDispatcherTimer进行倒计时。该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;
      }

我的时间安排没有考虑到什么?

4

3 回答 3

2

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

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

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

于 2009-12-08T08:58:41.490 回答
1

为什么不让你的显示器总是显示比剩余秒数少 1。这样,当您达到零时(显然使用 Math.Max(0, _countdown) 以防止显示-1),即使还有一秒钟的时间,时间似乎也已用完。

编辑:我的意思是暗示但没有说明 - 然后你可以只拥有一个Tick 处理程序而根本不使用睡眠,这将最终阻止 UI,这可能会阻止你的 UI 更新。

于 2009-12-08T05:08:21.387 回答
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();
        }
      });
    }
于 2009-12-08T05:03:51.257 回答