我使用的是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;
      }

我是什么也不考虑我的时间?

有帮助吗?

解决方案

它只更新当线程变为空闲(即后您的所有事件处理程序执行完毕)

-

在UI不会立即当您更改控件属性更新

Thread.sleep代码块的线程,则事件处理程序没有完成执行和UI不会重绘。

您必须要么使用其他计时器(在现有定时器的最后一跳开始一个新的计时器,并呼吁TakePicture于德新计时器的滴答声),或者甚至更好,使用现有的计时器的最后一跳 - 更新UI时(_countdown <= _countdownMax) ,拍照时(_countdown == _countdownMax + 1)

其他提示

为什么不直接让你的显示器总是表现出比的剩余秒数少1。当你到零,(很明显,一个Math.Max(0,_countdown),以防止显示-1),它会看起来像时间的方式已经用完了,即使还有一来二去。

编辑:我的意思暗示,但没有状态 - 是,然后你可以只的一个的节拍处理,并在所有这些只会拉闸反正阻塞UI不使用的睡眠这将可能从更新块的UI。

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

_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();
        }
      });
    }
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top