Timer WPF come il timer C #


177

Dove posso trovare un controllo simile al Controllo timer C # in WPF?

Risposte:


325

Il solito timer WPF è il DispatcherTimer, che non è un controllo ma utilizzato nel codice. Funziona sostanzialmente allo stesso modo del timer WinForms:

System.Windows.Threading.DispatcherTimer dispatcherTimer = new System.Windows.Threading.DispatcherTimer();
dispatcherTimer.Tick += dispatcherTimer_Tick;
dispatcherTimer.Interval = new TimeSpan(0,0,1);
dispatcherTimer.Start();


private void dispatcherTimer_Tick(object sender, EventArgs e)
{
  // code goes here
}

Ulteriori informazioni su DispatcherTimer sono disponibili qui


Ciao, ho provato a usare il timer di invio ma non riesco a trovarlo nella mia intelisense c'è qualche riferimento che deve essere aggiunto per usarlo?
giovedì

2
Mi piace il modo in cui hai impostato l'intervallo, meglio dei millisecondi secondo me.
JL.

Assicurati di chiamare dispatcherTimer.Stop () quando chiudi il modulo. La versione di WinForms del timer lo fa automaticamente. (Questo è il vantaggio di rendere il timer un controllo.) In caso contrario, avrai una perdita di memoria e probabilmente altri bug.
Trade-Ideas Philip,

7
@JL Eh? Quel codice è impossibile da interpretare. È molto megliovar timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(1) };
Jim Balter,

12

Con Dispatcher dovrai includere

using System.Windows.Threading;

Si noti inoltre che se si fa clic con il pulsante destro del mouse su DispatcherTimer e si fa clic su Risolvi, si dovrebbero aggiungere i riferimenti appropriati.


è necessario aggiungere un riferimento a WindowsBase.dll a proposito
George Birbilis

16
IMHO questo non risponde alla domanda su quale controllo usare, aggiunge semplicemente alcuni commenti alla risposta accettata.
Stephen Kennedy,

3
L'ho aggiunto nel 2012, appena iniziato come sviluppatore, ottengo ancora punti per questo. Ma come ha sottolineato @StephenKennedy, questo dovrebbe essere un commento.
Malcor,


0

Il timer ha funzioni speciali.

  1. Chiama un timer asincrono o un timer sincrono.
  2. Cambia l'intervallo di tempo
  3. Possibilità di annullare e riprendere  

se si utilizza StartAsync ()o Start (), il thread non blocca l'elemento dell'interfaccia utente

     namespace UITimer


     {
        using thread = System.Threading;
        public class Timer
        {

        public event Action<thread::SynchronizationContext> TaskAsyncTick;
        public event Action Tick;
        public event Action AsyncTick;
        public int Interval { get; set; } = 1;
        private bool canceled = false;
        private bool canceling = false;
        public async void Start()
        {
            while(true)
            {

                if (!canceled)
                {
                    if (!canceling)
                    {
                        await Task.Delay(Interval);
                        Tick.Invoke();
                    }
                }
                else
                {
                    canceled = false;
                    break;
                }
            }


        }
        public void Resume()
        {
            canceling = false;
        }
        public void Cancel()
        {
            canceling = true;
        }
        public async void StartAsyncTask(thread::SynchronizationContext 
        context)
        {

                while (true)
                {
                    if (!canceled)
                    {
                    if (!canceling)
                    {
                        await Task.Delay(Interval).ConfigureAwait(false);

                        TaskAsyncTick.Invoke(context);
                    }
                    }
                    else
                    {
                        canceled = false;
                        break;
                    }
                }

        }
        public void StartAsync()
        {
            thread::ThreadPool.QueueUserWorkItem((x) =>
            {
                while (true)
                {

                    if (!canceled)
                    {
                        if (!canceling)
                        {
                            thread::Thread.Sleep(Interval);

                    Application.Current.Dispatcher.Invoke(AsyncTick);
                        }
                    }
                    else
                    {
                        canceled = false;
                        break;
                    }
                }
            });
        }

        public void StartAsync(thread::SynchronizationContext context)
        {
            thread::ThreadPool.QueueUserWorkItem((x) =>
            {
                while(true)
                 {

                    if (!canceled)
                    {
                        if (!canceling)
                        {
                            thread::Thread.Sleep(Interval);
                            context.Post((xfail) => { AsyncTick.Invoke(); }, null);
                        }
                    }
                    else
                    {
                        canceled = false;
                        break;
                    }
                }
            });
        }
        public void Abort()
        {
            canceled = true;
        }
    }


     }

Puoi spiegare il tuo codice? Se pubblichi solo un po 'di codice, le persone non impareranno da esso e semplicemente copieranno e incolleranno del codice dal web.
Robert,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.