Como faço para adicionar um atraso após uma contagem regressiva
-
16-09-2019 - |
Pergunta
Eu estou usando um DispatcherTimer
para realizar uma contagem regressiva antes de disparar a liberação em uma câmera. O método UpdateCountdown
é usado para mudar a imagem exibida para o usuário antes que os fogos da câmara. Ao invés de ter o método TakePicture
executar imediatamente, gostaria têm um ligeiro atraso após o contador atingir zero e a última imagem é exibida.
O código mostrado abaixo resulta na pausa que ocorrem no ponto de _countdown = 1
. Enquanto a final imagem é exibida e incêndios TakePicture()
quase simultaneamente (acho TakePicture
ocorrer primeiro).
_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;
}
O que não estou levando em consideração com o meu tempo?
Solução
Será que a interface do usuário não atualizar imediatamente quando você alterar as propriedades de controle - ele só atualiza quando o fio se torna ocioso (isto é, após todos os seus manipuladores de eventos concluir a execução)
.blocos Thread.sleep o fio, os manipuladores de eventos não terminar execução e UI não é redesenhado.
Você tem que usar outro timer (iniciar um novo temporizador no último tick do temporizador existente e chamar TakePicture em carrapato teh novo temporizador) ou, melhor ainda, usar o último tick do temporizador existente - atualização UI quando (_countdown <= _countdownMax)
, tirar uma foto quando (_countdown == _countdownMax + 1)
.
Outras dicas
Porque não basta fazer sua exposição sempre mostrar 1 a menos do que o número de segundos restantes. Dessa forma, quando você começa a zero, (obviamente com um Math.max (0, _countdown) para evitar mostrando -1) vai parecer que o tempo se esgotou, embora há mais de um segundo para ir.
Edit: O que eu quis dar a entender, mas não fez estado - era que você poderia, então, só tem um manipulador Tick e não usam a latência em tudo que só vai acabar bloqueando a de qualquer maneira UI que provavelmente bloquear o seu UI de atualização.
Eu não acho que os eventos de garantir que os manipuladores de eventos são acionados na ordem em que eles são registrados. Tentar
_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();
}
});
}