Temporizador WPF como temporizador c #


177

Onde posso encontrar um controle que seja como o Controle de Timer C # no WPF?

Respostas:


325

O cronômetro WPF usual é o DispatcherTimer, que não é um controle, mas é usado no código. Basicamente, funciona da mesma maneira que o 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
}

Mais informações sobre o DispatcherTimer podem ser encontradas aqui


Olá, estou tentando usar o timer de despacho, mas não consigo encontrá-lo no meu intelisense. Existe alguma referência que precise ser adicionada para que eu possa usá-lo?
Yohannes

2
Gosto da maneira como você define o intervalo, melhor que milissegundos na minha opinião.
JL.

Certifique-se de chamar dispatcherTimer.Stop () ao fechar seu formulário. A versão WinForms do timer faz isso automaticamente. (Essa é a vantagem de transformar o timer em um controle.) Caso contrário, haverá um vazamento de memória e possivelmente outros bugs.
Trade-Ideas Philip

7
@JL Eh? Esse código é impossível de interpretar. Muito melhor évar timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(1) };
Jim Balter

12

Com o Dispatcher, você precisará incluir

using System.Windows.Threading;

Observe também que, se você clicar com o botão direito do mouse em DispatcherTimer e clicar em Resolver, deverá adicionar as referências apropriadas.


precisamos adicionar referência a WindowsBase.dll btw
George Birbilis

16
IMHO isso não responde à pergunta sobre qual controle usar, apenas adiciona alguns comentários à resposta aceita.
Stephen Kennedy

3
Eu adicionei isso em 2012, apenas começando como desenvolvedor, ainda recebo pontos por isso. Mas, como a @StephenKennedy apontou, isso deve ser um comentário.
Malcor


0

O temporizador tem funções especiais.

  1. Chame um cronômetro assíncrono ou sincronizado.
  2. Alterar o intervalo de tempo
  3. Capacidade de cancelar e retomar  

se você usar StartAsync ()ou Start (), o encadeamento não bloqueará o elemento da interface do usuário

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


     }

Você pode explicar seu código? Se você postar algum código, as pessoas não aprenderão com ele e apenas copiarão e colarão algum código da Web.
Robert
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.