Domanda

Sto usando un DispatcherTimer per eseguire un conto alla rovescia prima di innescare il rilascio di una macchina fotografica. Il metodo UpdateCountdown viene utilizzato per modificare l'immagine visualizzata per l'utente prima che i fuochi della fotocamera. Piuttosto che avere il metodo TakePicture eseguire immediatamente, desidero avere un leggero ritardo dopo il contatore raggiunge lo zero e viene visualizzata l'ultima immagine.

Il codice riportato di seguito i risultati della pausa che si verificano nel punto _countdown = 1. Mentre la finale riproduzione dell'immagine e incendi TakePicture() quasi contemporaneamente (Credo TakePicture verifichi per prima).

_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;
      }

Che cosa sono io non tenendo conto con il mio tempo?

È stato utile?

Soluzione

L'interfaccia utente non viene aggiornato immediatamente quando si modificano le proprietà di controllo - esso soltanto gli aggiornamenti quando il filo diventa inattiva (cioè, dopo tutti i vostri gestori di eventi terminare l'esecuzione)

.

blocchi Thread.Sleep il filo, i gestori di eventi non finiscono di esecuzione e interfaccia utente non viene ridisegnato.

La pagina può essere utilizzato per un altro timer (iniziare un nuovo timer l'ultimo tick del timer esistente e chiamare TakePicture sul tick Teh nuovo timer) o, meglio ancora, utilizzare l'ultimo tick del timer esistente - aggiornamento dell'interfaccia utente quando (_countdown <= _countdownMax) , scattare foto quando (_countdown == _countdownMax + 1).

Altri suggerimenti

Perché non basta fare il display mostrerà sempre 1 inferiore al numero di secondi rimanenti. In questo modo quando si arriva a zero, (ovviamente con un Math.max (0, _countdown) per impedire che mostra -1) sembrerà come il tempo è scaduto, anche se c'è un altro secondo per andare.

Modifica: Quello che intendevo insinuare, ma non ha precisato - è che si potrebbe poi basta avere una handler Tick e non utilizzare dormire a tutti che sarà solo finire bloccare l'interfaccia utente in ogni caso, che probabilmente lo farà bloccare l'interfaccia utente di aggiornare.

Non credo che gli eventi garantire che i gestori di eventi si verificano in modo che essi siano registrati. Prova

_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();
        }
      });
    }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top