카운트 다운 타이머 후 지연을 추가하려면 어떻게합니까?
-
16-09-2019 - |
문제
나는 a를 사용하고있다 DispatcherTimer
카메라에서 릴리스를 트리거하기 전에 카운트 다운을 수행합니다. 그만큼 UpdateCountdown
메소드는 카메라가 발사되기 전에 사용자에게 표시된 이미지를 변경하는 데 사용됩니다. 가지고있는 것보다 TakePicture
메소드가 즉시 실행되면 카운터가 0에 도달하고 마지막 이미지가 표시된 후 약간의 지연을 원합니다.
아래에 표시된 코드는 _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가 다시 그려지지 않습니다.
다른 타이머를 사용해야합니다 (기존 타이머의 마지막 진드기에서 새 타이머를 시작하고 Teh New Timer 's Tick에서 TakePicture를 호출하십시오). (_countdown <= _countdownMax)
, 언제 사진을 찍으십시오 (_countdown == _countdownMax + 1)
.
다른 팁
디스플레이가 항상 남은 초보다 1을 낮게 표시하게하지 않겠습니까? 그렇게하면 0에 도달하면 (-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();
}
});
}