Timer Classe

Definição

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 classe, usando um inteiro assinado de 32 bits para especificar o intervalo de tempo.

Timer(TimerCallback, Object, Int64, Int64)

Inicializa uma nova instância da Timer classe, usando inteiros com sinal de 64 bits para medir intervalos de tempo.

Timer(TimerCallback, Object, TimeSpan, TimeSpan)

Inicializa uma nova instância da Timer classe, usando TimeSpan valores para medir intervalos de tempo.

Timer(TimerCallback, Object, UInt32, UInt32)

Inicializa uma nova instância da Timer classe, usando inteiros sem sinal de 32 bits para medir intervalos de tempo.

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.

Ver também