[英]How do I add a delay after a count down timer
我正在使用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),或者甚至更好的是,使用現有計時器的最后一個刻度-在(_countdown <= _countdownMax)
,在(_countdown == _countdownMax + 1)
時(_countdown == _countdownMax + 1)
。
為什么不讓您的顯示器總是比剩余的秒數少顯示1。 這樣,當您達到零時(顯然要用Math.Max(0,_countdown來防止顯示-1)),即使還有一秒鍾,時間也似乎已經用完了。
編輯:我的意思是暗示但未聲明-是這樣,您可以只擁有一個 Tick處理程序,而根本不使用睡眠,這只會阻塞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 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.