Как добавить задержку после таймера обратного отсчета
Я использую 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;
}
Что я не принимаю во внимание со временем?
3 ответа
Пользовательский интерфейс не обновляется сразу же после изменения свойств элемента управления - он обновляется только тогда, когда поток становится бездействующим (то есть после завершения выполнения всех ваших обработчиков событий).
Thread.Sleep блокирует поток, обработчики событий не завершаются и пользовательский интерфейс не перерисовывается.
Вы должны либо использовать другой таймер (запустить новый таймер на последнем тике существующего таймера и вызвать TakePicture на тике нового таймера), либо, что еще лучше, использовать последний тик существующего таймера - обновлять пользовательский интерфейс, когда (_countdown <= _countdownMax)
сфотографируй когда (_countdown == _countdownMax + 1)
,
Почему бы просто не сделать так, чтобы ваш дисплей всегда показывал на 1 меньше, чем количество оставшихся секунд. Таким образом, когда вы доберетесь до нуля (очевидно, с помощью Math.Max (0, _countdown), чтобы не показывать -1), будет казаться, что время истекло, хотя еще есть еще одна секунда.
Изменить: То, что я имел в виду, но не утверждал, - это то, что вы можете просто иметь один обработчик Tick и вообще не использовать Sleep, что в любом случае приведет к блокировке пользовательского интерфейса, что, вероятно, заблокирует обновление вашего пользовательского интерфейса.
Я не думаю, что события гарантируют, что обработчики событий будут срабатывать в том порядке, в котором они зарегистрированы. Пытаться
_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();
}
});
}