Timer Classe
Definição
Importante
Algumas informações dizem respeito a um produto pré-lançado que pode ser substancialmente modificado antes de ser lançado. A Microsoft não faz garantias, de forma expressa ou implícita, em relação à informação aqui apresentada.
Fornece um mecanismo para executar um método numa thread pool de threads em intervalos especificados. Esta classe não pode ser herdada.
public ref class Timer sealed : IDisposable
public ref class Timer sealed : MarshalByRefObject, IDisposable
public ref class Timer sealed : MarshalByRefObject, IAsyncDisposable, IDisposable
[System.Runtime.InteropServices.ComVisible(true)]
public sealed class Timer : IDisposable
public sealed class Timer : MarshalByRefObject, IDisposable
[System.Runtime.InteropServices.ComVisible(true)]
public sealed class Timer : MarshalByRefObject, IDisposable
public sealed class Timer : MarshalByRefObject, IAsyncDisposable, IDisposable
[<System.Runtime.InteropServices.ComVisible(true)>]
type Timer = class
interface IDisposable
type Timer = class
inherit MarshalByRefObject
interface IDisposable
[<System.Runtime.InteropServices.ComVisible(true)>]
type Timer = class
inherit MarshalByRefObject
interface IDisposable
type Timer = class
inherit MarshalByRefObject
interface IAsyncDisposable
interface IDisposable
Public NotInheritable Class Timer
Implements IDisposable
Public NotInheritable Class Timer
Inherits MarshalByRefObject
Implements IDisposable
Public NotInheritable Class Timer
Inherits MarshalByRefObject
Implements IAsyncDisposable, IDisposable
- Herança
-
Timer
- Herança
- Atributos
- Implementações
Exemplos
O exemplo seguinte define uma StatusChecker classe que inclui um CheckStatus método cuja assinatura é igual à do TimerCallback delegado. O state argumento do CheckStatus método é um AutoResetEvent objeto usado para sincronizar o thread de aplicação e o thread pool de threads que executa o delegado de callback. A StatusChecker classe inclui também duas variáveis de estado:
invokeCount
Indica o número de vezes que o método de callback foi invocado.
maxCount
Determina o número máximo de vezes que o método de callback deve ser invocado.
O thread de aplicação cria o temporizador, que espera um segundo e depois executa o CheckStatus método de callback a cada 250 milissegundos. O thread da aplicação bloqueia então até que o AutoResetEvent objeto seja sinalizado. Quando o CheckStatus método de callback é maxCount executado vezes, chama o AutoResetEvent.Set método para definir o estado do AutoResetEvent objeto como sinalizado. Na primeira vez que isto acontece, o thread da aplicação chama o Change(Int32, Int32) método para que o método de callback seja agora executado a cada meio segundo. Bloqueia novamente até que o AutoResetEvent objeto seja sinalizado. Quando isto acontece, o temporizador é destruído ao chamar o seu Dispose método, e a aplicação termina.
using System;
using System.Threading;
class TimerExample
{
static void Main()
{
// Create an AutoResetEvent to signal the timeout threshold in the
// timer callback has been reached.
var autoEvent = new AutoResetEvent(false);
var statusChecker = new StatusChecker(10);
// Create a timer that invokes CheckStatus after one second,
// and every 1/4 second thereafter.
Console.WriteLine("{0:h:mm:ss.fff} Creating timer.\n",
DateTime.Now);
var stateTimer = new Timer(statusChecker.CheckStatus,
autoEvent, 1000, 250);
// When autoEvent signals, change the period to every half second.
autoEvent.WaitOne();
stateTimer.Change(0, 500);
Console.WriteLine("\nChanging period to .5 seconds.\n");
// When autoEvent signals the second time, dispose of the timer.
autoEvent.WaitOne();
stateTimer.Dispose();
Console.WriteLine("\nDestroying timer.");
}
}
class StatusChecker
{
private int invokeCount;
private int maxCount;
public StatusChecker(int count)
{
invokeCount = 0;
maxCount = count;
}
// This method is called by the timer delegate.
public void CheckStatus(Object stateInfo)
{
AutoResetEvent autoEvent = (AutoResetEvent)stateInfo;
Console.WriteLine("{0} Checking status {1,2}.",
DateTime.Now.ToString("h:mm:ss.fff"),
(++invokeCount).ToString());
if(invokeCount == maxCount)
{
// Reset the counter and signal the waiting thread.
invokeCount = 0;
autoEvent.Set();
}
}
}
// The example displays output like the following:
// 11:59:54.202 Creating timer.
//
// 11:59:55.217 Checking status 1.
// 11:59:55.466 Checking status 2.
// 11:59:55.716 Checking status 3.
// 11:59:55.968 Checking status 4.
// 11:59:56.218 Checking status 5.
// 11:59:56.470 Checking status 6.
// 11:59:56.722 Checking status 7.
// 11:59:56.972 Checking status 8.
// 11:59:57.223 Checking status 9.
// 11:59:57.473 Checking status 10.
//
// Changing period to .5 seconds.
//
// 11:59:57.474 Checking status 1.
// 11:59:57.976 Checking status 2.
// 11:59:58.476 Checking status 3.
// 11:59:58.977 Checking status 4.
// 11:59:59.477 Checking status 5.
// 11:59:59.977 Checking status 6.
// 12:00:00.478 Checking status 7.
// 12:00:00.980 Checking status 8.
// 12:00:01.481 Checking status 9.
// 12:00:01.981 Checking status 10.
//
// Destroying timer.
Imports System.Threading
Public Module Example
Public Sub Main()
' Use an AutoResetEvent to signal the timeout threshold in the
' timer callback has been reached.
Dim autoEvent As New AutoResetEvent(False)
Dim statusChecker As New StatusChecker(10)
' Create a timer that invokes CheckStatus after one second,
' and every 1/4 second thereafter.
Console.WriteLine("{0:h:mm:ss.fff} Creating timer." & vbCrLf,
DateTime.Now)
Dim stateTimer As New Timer(AddressOf statusChecker.CheckStatus,
autoEvent, 1000, 250)
' When autoEvent signals, change the period to every half second.
autoEvent.WaitOne()
stateTimer.Change(0, 500)
Console.WriteLine(vbCrLf & "Changing period to .5 seconds." & vbCrLf)
' When autoEvent signals the second time, dispose of the timer.
autoEvent.WaitOne()
stateTimer.Dispose()
Console.WriteLine(vbCrLf & "Destroying timer.")
End Sub
End Module
Public Class StatusChecker
Dim invokeCount, maxCount As Integer
Sub New(count As Integer)
invokeCount = 0
maxCount = count
End Sub
' The timer callback method.
Sub CheckStatus(stateInfo As Object)
Dim autoEvent As AutoResetEvent = DirectCast(stateInfo, AutoResetEvent)
invokeCount += 1
Console.WriteLine("{0:h:mm:ss.fff} Checking status {1,2}.",
DateTime.Now, invokeCount)
If invokeCount = maxCount Then
' Reset the counter and signal the waiting thread.
invokeCount = 0
autoEvent.Set()
End If
End Sub
End Class
' The example displays output like the following:
' 11:59:54.202 Creating timer.
'
' 11:59:55.217 Checking status 1.
' 11:59:55.466 Checking status 2.
' 11:59:55.716 Checking status 3.
' 11:59:55.968 Checking status 4.
' 11:59:56.218 Checking status 5.
' 11:59:56.470 Checking status 6.
' 11:59:56.722 Checking status 7.
' 11:59:56.972 Checking status 8.
' 11:59:57.223 Checking status 9.
' 11:59:57.473 Checking status 10.
'
' Changing period to .5 seconds.
'
' 11:59:57.474 Checking status 1.
' 11:59:57.976 Checking status 2.
' 11:59:58.476 Checking status 3.
' 11:59:58.977 Checking status 4.
' 11:59:59.477 Checking status 5.
' 11:59:59.977 Checking status 6.
' 12:00:00.478 Checking status 7.
' 12:00:00.980 Checking status 8.
' 12:00:01.481 Checking status 9.
' 12:00:01.981 Checking status 10.
'
' Destroying timer.
Observações
Usa um TimerCallback delegado para especificar o método que queres que ele Timer execute. A assinatura do TimerCallback delegado é:
void TimerCallback(Object state)
Sub TimerCallback(state As Object)
O delegado do temporizador é especificado quando o temporizador é construído e não pode ser alterado. O método não se executa no thread que criou o temporizador; Executa-se numa ThreadPool thread fornecida pelo sistema.
Tip
.NET inclui várias classes temporizadoras, cada uma das quais oferece funcionalidades diferentes:
- System.Timers.Timer, que dispara um evento e executa o código em um ou mais sumidouros de eventos a intervalos regulares. A classe destina-se a ser usada como componente baseado em servidor ou de serviço num ambiente multithread; Não tem interface de utilizador e não é visível em tempo de execução.
- System.Threading.Timer, que executa um único método de callback numa thread pool de threads a intervalos regulares. O método de callback é definido quando o temporizador é instanciado e não pode ser alterado. Tal como a System.Timers.Timer classe, esta classe destina-se a ser usada como componente baseado em servidor ou serviço num ambiente multithread; não tem interface de utilizador e não é visível em tempo de execução.
- System.Windows.Forms.Timer, um componente Windows Forms que dispara um evento e executa o código em um ou mais sumidoiros de eventos a intervalos regulares. O componente não tem interface de utilizador e foi concebido para ser utilizado num ambiente de thread única; executa-se na thread da interface.
- System.Web.UI.Timer (apenas .NET Framework), um componente ASP.NET que realiza postbacks de páginas web assíncronas ou síncronas a intervalos regulares.
-
System.Windows.Threading.DispatcherTimer, um temporizador integrado na fila
Dispatcher. Este temporizador é processado com uma prioridade especificada num intervalo de tempo especificado.
Quando crias um temporizador, podes especificar um tempo de espera antes da primeira execução do método (tempo de vencimento) e um tempo de espera entre execuções subsequentes (ponto). A Timer classe tem a mesma resolução do relógio do sistema. Isto significa que, se o período for inferior à resolução do relógio do sistema, o delegado TimerCallback executará em intervalos definidos pela resolução do relógio do sistema, que é aproximadamente 15 milissegundos nos sistemas Windows 7 e Windows 8. Pode alterar o tempo e o período de devida, ou desativar o temporizador, usando o Change método.
Note
Desde que esteja a usar um Timer, deve manter uma referência a ele. Tal como em qualquer objeto gerido, a Timer está sujeito a recolha de lixo quando não há referências a ele. O facto de a Timer ainda estar ativa não impede que seja recolhida.
Note
O relógio do sistema utilizado é o mesmo que o GetTickCount, que não é afetado por alterações feitas com timeBeginPeriod e timeEndPeriod.
Quando um temporizador deixar de ser necessário, use o Dispose método para libertar os recursos armazenados pelo temporizador. Note-se que os callbacks podem ocorrer depois de a Dispose() sobrecarga do método ter sido chamada, porque o temporizador coloca callbacks na fila para execução pelos threads do pool de threads. Podes usar o Dispose(WaitHandle) método overload para esperar até que todas as chamadas de retorno estejam concluídas.
O método de callback executado pelo temporizador deve ser reentrante, porque é chamado em ThreadPool threads. O callback pode ser executado simultaneamente em dois threads do pool de threads se o intervalo do temporizador for inferior ao tempo necessário para executar o callback, ou se todos os threads do pool de threads estiverem em uso e o callback for colocado em fila várias vezes.
Note
System.Threading.Timer é um temporizador simples e leve que utiliza métodos de callback e é servido por threads pool. Não é recomendado para uso com o Windows Forms, porque os seus callbacks não ocorrem na thread da interface do utilizador. System.Windows.Forms.Timer é uma escolha melhor para usar com Windows Forms. Para funcionalidades de temporizador baseado em servidor, pode considerar usar System.Timers.Timer, que gera eventos e tem funcionalidades adicionais.
Construtores
| Name | Description |
|---|---|
| Timer(TimerCallback, Object, Int32, Int32) |
Inicializa uma nova instância da |
| Timer(TimerCallback, Object, Int64, Int64) |
Inicializa uma nova instância da |
| Timer(TimerCallback, Object, TimeSpan, TimeSpan) |
Inicializa uma nova instância da |
| Timer(TimerCallback, Object, UInt32, UInt32) |
Inicializa uma nova instância da |
| Timer(TimerCallback) |
Inicializa uma nova instância da Timer classe com um período infinito e um tempo de vencimento infinito, usando o objeto recém-criado Timer como objeto de estado. |
Métodos
| Name | Description |
|---|---|
| Change(Int32, Int32) |
Altera a hora de início e o intervalo entre invocações de métodos para um temporizador, usando inteiros com sinal de 32 bits para medir intervalos de tempo. |
| Change(Int64, Int64) |
Altera a hora de início e o intervalo entre invocações de métodos para um temporizador, usando inteiros com sinal de 64 bits para medir intervalos de tempo. |
| Change(TimeSpan, TimeSpan) |
Altera a hora de início e o intervalo entre invocações de métodos para um temporizador, usando TimeSpan valores para medir intervalos de tempo. |
| Change(UInt32, UInt32) |
Altera a hora de início e o intervalo entre invocações de métodos para um temporizador, usando inteiros sem sinal de 32 bits para medir intervalos de tempo. |
| CreateObjRef(Type) |
Cria um objeto que contém toda a informação relevante necessária para gerar um proxy usado para comunicar com um objeto remoto. (Herdado de MarshalByRefObject) |
| Dispose() |
Liberta todos os recursos usados pela instância atual de Timer. |
| Dispose(WaitHandle) |
Liberta todos os recursos usados pela instância atual de Timer e sinaliza quando o temporizador foi eliminado. |
| DisposeAsync() |
Liberta todos os recursos usados pela instância atual de Timer. |
| Equals(Object) |
Determina se o objeto especificado é igual ao objeto atual. (Herdado de Object) |
| Finalize() |
Permite que um objeto tente libertar recursos e realizar outras operações de limpeza antes de ser recuperado pela recolha de lixo. |
| GetHashCode() |
Serve como função de hash predefinida. (Herdado de Object) |
| GetLifetimeService() |
Recupera o objeto de serviço de tempo de vida atual que controla a política de vida útil neste caso. (Herdado de MarshalByRefObject) |
| GetType() |
Obtém o Type da instância atual. (Herdado de Object) |
| InitializeLifetimeService() |
Obtém-se um objeto de serviço vitalício para controlar a apólice vitalícia neste caso. (Herdado de MarshalByRefObject) |
| MemberwiseClone() |
Cria uma cópia superficial do atual Object. (Herdado de Object) |
| MemberwiseClone(Boolean) |
Cria uma cópia superficial do objeto atual MarshalByRefObject . (Herdado de MarshalByRefObject) |
| ToString() |
Devolve uma cadeia que representa o objeto atual. (Herdado de Object) |
Métodos da Extensão
| Name | Description |
|---|---|
| ConfigureAwait(IAsyncDisposable, Boolean) |
Configura como aguarda nas tarefas devolvidas de um descartável assíncrono será realizada. |
Aplica-se a
Segurança de Thread
Este tipo é seguro para fios.