Temporizador WPF como temporizador C #


177

¿Dónde puedo encontrar un control que sea como el Control de temporizador C # en WPF?

Respuestas:


325

El temporizador WPF habitual es el DispatcherTimer, que no es un control pero se usa en código. Básicamente funciona de la misma manera que el temporizador 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
}

Puede encontrar más información sobre DispatcherTimer aquí


Hola, he estado tratando de usar el temporizador de envío, pero no puedo encontrarlo en mi intelisense. ¿Hay alguna referencia que deba agregarse para poder usarlo?
Yohannes

2
Me gusta la forma en que establece el intervalo, mejor que milisegundos en mi opinión.
JL.

Asegúrese de llamar a dispatcherTimer.Stop () cuando cierre su formulario. La versión de WinForms del temporizador lo hace automáticamente. (Esa es la ventaja de hacer que el temporizador sea un Control). Si no lo hace, tendrá una pérdida de memoria y posiblemente otros errores.
Trade-Ideas Philip

77
@JL Eh? Ese código es imposible de interpretar. Mucho mejor esvar timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(1) };
Jim Balter

12

Con Dispatcher deberás incluir

using System.Windows.Threading;

También tenga en cuenta que si hace clic con el botón derecho en DispatcherTimer y hace clic en Resolver, debería agregar las referencias apropiadas.


necesita agregar referencia a WindowsBase.dll por cierto
George Birbilis

16
En mi humilde opinión, esto no responde a la pregunta sobre qué control usar, simplemente agrega algunos comentarios a la respuesta aceptada.
Stephen Kennedy

3
Agregué esto en 2012, recién comenzando como desarrollador, todavía obtengo puntos por ello. Pero como señaló @StephenKennedy, esto debería ser un comentario.
Malcor


0

El temporizador tiene funciones especiales.

  1. Llame a un temporizador asíncrono o temporizador síncrono.
  2. Cambiar el intervalo de tiempo
  3. Posibilidad de cancelar y reanudar  

si usa StartAsync ()o Start (), el hilo no bloquea el elemento de la interfaz de usuario

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


     }

¿Puedes explicar tu código? Si solo publica un código, la gente no aprenderá de él y simplemente copiará y pegará un código de la web.
Robert
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.