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.