题
我使用的是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();
}
});
}
不隶属于 StackOverflow