Как добавить задержку после таймера обратного отсчета

Я использую 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();
        }
      });
    }
Другие вопросы по тегам