TOC

This article is currently in the process of being translated into Portuguese (~99% done).

Misc.:

The DispatcherTimer

No Windows Forms, há um controle chamado Timer, o qual pode realizar acções repetidas vezes dentro de um intervalo de tempo determinado. WPF também tem esta possibilidade, mas ao invés de um controle invisível, temos o controle DispatcherTimer. Este faz praticamente a mesma coisa, mas ao invés de solta-lo no formulário, deves cria-lo e usa exclusivamente no seu Code-behind.

A classe DispatcherTimer funciona especificando um intervalo e, em seguida, assinando o evento Tick que ocorrerá sempre que esse intervalo for atingido. O DispatcherTimer não é iniciado antes de você chamar o método Iniciar () ou definir a propriedade IsEnabled como true.

Vamos tentar um exemplo simples em que usamos um DispatcherTimer para criar um relógio digital:

<Window x:Class="WpfTutorialSamples.Misc.DispatcherTimerSample"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="DispatcherTimerSample" Height="150" Width="250">
    <Grid>
        <Label Name="lblTime" FontSize="48" HorizontalAlignment="Center" VerticalAlignment="Center" />
    </Grid>
</Window>
using System;
using System.Windows;
using System.Windows.Threading;

namespace WpfTutorialSamples.Misc
{
	public partial class DispatcherTimerSample : Window
	{
		public DispatcherTimerSample()
		{
			InitializeComponent();
			DispatcherTimer timer = new DispatcherTimer();
			timer.Interval = TimeSpan.FromSeconds(1);
			timer.Tick += timer_Tick;
			timer.Start();
		}

		void timer_Tick(object sender, EventArgs e)
		{
			lblTime.Content = DateTime.Now.ToLongTimeString();
		}
	}
}

A parte XAML é extremamente simples - é meramente uma etiqueta centralizada com um tamanho de fonte grande, usada para exibir a hora atual.

Code-behind é onde a mágica acontece neste exemplo. No construtor da janela, criamos uma instância do DispatcherTimer. Nós definimos a propriedade Interval como um segundo, assinamos o evento Tick e então iniciamos o cronômetro. No evento Tick, simplesmente atualizamos o rótulo para mostrar a hora atual.

Naturalmente, o DispatcherTimer pode funcionar em intervalos menores ou muito maiores. Por exemplo, você pode querer que algo aconteça a cada 30 segundos ou 5 minutos - basta usar os métodos TimeSpan.From *, como FromSeconds ou FromMinutes, ou criar uma nova instância de TimeSpan que atenda totalmente às suas necessidades.

Para mostrar do que o DispatcherTimer é capaz, vamos tentar atualizar com mais frequência ... Com muito mais frequência!

using System;
using System.Windows;
using System.Windows.Threading;

namespace WpfTutorialSamples.Misc
{
	public partial class DispatcherTimerSample : Window
	{
		public DispatcherTimerSample()
		{
			InitializeComponent();
			DispatcherTimer timer = new DispatcherTimer();
			timer.Interval = TimeSpan.FromMilliseconds(1);
			timer.Tick += timer_Tick;
			timer.Start();
		}

		void timer_Tick(object sender, EventArgs e)
		{
			lblTime.Content = DateTime.Now.ToString("HH:mm:ss.fff");
		}
	}
}

Como você pode ver, agora pedimos ao DispatcherTimer para disparar a cada milissegundo! No evento Tick, usamos uma string de formato de hora personalizada para mostrar os milissegundos no rótulo também. Agora você tem algo que poderia ser facilmente usado como cronômetro - basta adicionar alguns botões à janela e chamá-los de Stop () , Start () e Métodos Restart () no temporizador.

Resumo

Existem muitas situações em que você precisaria de algo em seu aplicativo para ocorrer em um determinado intervalo e, usando o DispatcherTimer, é muito fácil de realizar. Esteja ciente de que, se você fizer algo complicado no seu evento do Tick, ele não deve ser executado com muita frequência, como no último exemplo em que o cronômetro marca cada milésimo de segundo - o que sobrecarregará o computador que executa seu aplicativo.

Também esteja ciente de que o DispatcherTimer não é 100% preciso em todas as situações. As operações de seleção são colocadas na fila do Dispatcher, portanto, se o computador estiver sob muita pressão, sua operação poderá ser atrasada. O .NET framework promete que o evento Tick nunca ocorrerá muito cedo, mas não pode prometer que não será um pouco atrasado. No entanto, para a maioria dos casos de uso, o DispatcherTimer é mais do que preciso o suficiente.

Se você precisar que seu cronômetro tenha uma prioridade mais alta na fila, será possível configurar o DispatcherPriority enviando um dos valores ao longo da prioridade do DispatcherTimer. Mais informações sobre isso podem ser encontradas neste artigo do MSDN .


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!