Timer Clase

Definición

Proporciona un mecanismo para ejecutar un método en un subproceso del grupo de subprocesos en intervalos especificados. Esta clase no puede heredarse.

public ref class Timer sealed : IDisposable
public ref class Timer sealed : MarshalByRefObject, IAsyncDisposable, IDisposable
public ref class Timer sealed : MarshalByRefObject, System::Threading::ITimer
public ref class Timer sealed : MarshalByRefObject, IDisposable
[System.Runtime.InteropServices.ComVisible(true)]
public sealed class Timer : IDisposable
public sealed class Timer : MarshalByRefObject, IAsyncDisposable, IDisposable
public sealed class Timer : MarshalByRefObject, System.Threading.ITimer
public sealed class Timer : MarshalByRefObject, IDisposable
[System.Runtime.InteropServices.ComVisible(true)]
public sealed class Timer : MarshalByRefObject, IDisposable
[<System.Runtime.InteropServices.ComVisible(true)>]
type Timer = class
    interface IDisposable
type Timer = class
    inherit MarshalByRefObject
    interface IAsyncDisposable
    interface IDisposable
type Timer = class
    inherit MarshalByRefObject
    interface IAsyncDisposable
    interface IDisposable
    interface ITimer
type Timer = class
    inherit MarshalByRefObject
    interface IDisposable
[<System.Runtime.InteropServices.ComVisible(true)>]
type Timer = class
    inherit MarshalByRefObject
    interface IDisposable
Public NotInheritable Class Timer
Implements IDisposable
Public NotInheritable Class Timer
Inherits MarshalByRefObject
Implements IAsyncDisposable, IDisposable
Public NotInheritable Class Timer
Inherits MarshalByRefObject
Implements ITimer
Public NotInheritable Class Timer
Inherits MarshalByRefObject
Implements IDisposable
Herencia
Timer
Herencia
Atributos
Implementaciones

Ejemplos

En el ejemplo siguiente se define una StatusChecker clase que incluye un CheckStatus método cuya firma es la misma que el TimerCallback delegado. El state argumento del CheckStatus método es un AutoResetEvent objeto que se usa para sincronizar el subproceso de aplicación y el subproceso del grupo de subprocesos que ejecuta el delegado de devolución de llamada. La StatusChecker clase también incluye dos variables de estado:

invokeCount Indica el número de veces que se ha invocado el método de devolución de llamada.

maxCount Determina el número máximo de veces que se debe invocar el método de devolución de llamada.

El subproceso de aplicación crea el temporizador, que espera un segundo y, a continuación, ejecuta el CheckStatus método de devolución de llamada cada 250 milisegundos. A continuación, el subproceso de aplicación se bloquea hasta que se señale el AutoResetEvent objeto . Cuando el CheckStatus método de devolución de llamada se ejecuta maxCount veces, llama al AutoResetEvent.Set método para establecer el estado del AutoResetEvent objeto en señalizado. La primera vez que esto sucede, el subproceso de aplicación llama al Change(Int32, Int32) método para que el método de devolución de llamada se ejecute ahora cada medio segundo. Una vez más se bloquea hasta que se señala el AutoResetEvent objeto. Cuando esto sucede, el temporizador se destruye llamando a su Dispose método y la aplicación finaliza.

using namespace System;
using namespace System::Threading;

ref class StatusChecker
{
private:
    int invokeCount, maxCount;

public:
    StatusChecker(int count)
    {
        invokeCount  = 0;
        maxCount = count;
    }

    // This method is called by the timer delegate.
    void CheckStatus(Object^ stateInfo)
    {
        AutoResetEvent^ autoEvent = dynamic_cast<AutoResetEvent^>(stateInfo);
        Console::WriteLine("{0:h:mm:ss.fff} Checking status {1,2}.",
                           DateTime::Now, ++invokeCount);

        if (invokeCount == maxCount) {
            // Reset the counter and signal the waiting thread.
            invokeCount  = 0;
            autoEvent->Set();
        }
    }
};

ref class TimerExample
{
public:
    static void Main()
    {
        // Create an AutoResetEvent to signal the timeout threshold in the
        // timer callback has been reached.
        AutoResetEvent^ autoEvent = gcnew AutoResetEvent(false);

        StatusChecker^ statusChecker = gcnew StatusChecker(10);

        // Create a delegate that invokes methods for the timer.
        TimerCallback^ tcb =
           gcnew TimerCallback(statusChecker, &StatusChecker::CheckStatus);

        // 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);
        Timer^ stateTimer = gcnew Timer(tcb, autoEvent, 1000, 250);

        // When autoEvent signals, change the period to every half second.
        autoEvent->WaitOne(5000, false);
        stateTimer->Change(0, 500);
        Console::WriteLine("\nChanging period to .5 seconds.\n");

        // When autoEvent signals the second time, dispose of the timer.
        autoEvent->WaitOne(5000, false);
        stateTimer->~Timer();
        Console::WriteLine("\nDestroying timer.");
    }
};

int main()
{
    TimerExample::Main();
}
// 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.
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.

Comentarios

Use un TimerCallback delegado para especificar el método que desea Timer ejecutar. La firma del TimerCallback delegado es:

void TimerCallback(Object state)
void TimerCallback(Object state)
Sub TimerCallback(state As Object)

El delegado del temporizador se especifica cuando se construye el temporizador y no se puede cambiar. El método no se ejecuta en el subproceso que creó el temporizador; se ejecuta en un ThreadPool subproceso proporcionado por el sistema.

Sugerencia

.NET incluye varias clases de temporizador, cada una de las cuales ofrece una funcionalidad diferente:

  • System.Timers.Timer, que desencadena un evento y ejecuta el código en uno o varios receptores de eventos a intervalos regulares. La clase está pensada para su uso como componente de servicio o basado en servidor en un entorno multiproceso; no tiene ninguna interfaz de usuario y no está visible en tiempo de ejecución.
  • System.Threading.Timer, que ejecuta un único método de devolución de llamada en un subproceso del grupo de subprocesos a intervalos regulares. El método de devolución de llamada se define cuando se crea una instancia del temporizador y no se puede cambiar. Al igual que la System.Timers.Timer clase , esta clase está pensada para su uso como componente de servicio o basado en servidor en un entorno multiproceso; no tiene interfaz de usuario y no está visible en tiempo de ejecución.
  • System.Windows.Forms.Timer, un componente de Windows Forms que desencadena un evento y ejecuta el código en uno o varios receptores de eventos a intervalos regulares. El componente no tiene interfaz de usuario y está diseñado para su uso en un entorno de un solo subproceso; se ejecuta en el subproceso de interfaz de usuario.
  • System.Web.UI.Timer (solo .NET Framework), un componente de ASP.NET que realiza postbacks asincrónicos o sincrónicos de páginas web a intervalos regulares.
  • System.Windows.Threading.DispatcherTimer, un temporizador que está integrado en la Dispatcher cola. Este temporizador se procesa con una prioridad especificada en un intervalo de tiempo especificado.

Al crear un temporizador, puede especificar una cantidad de tiempo para esperar antes de la primera ejecución del método (tiempo de vencimiento) y una cantidad de tiempo para esperar entre ejecuciones posteriores (período). La Timer clase tiene la misma resolución que el reloj del sistema. Esto significa que si el período es menor que la resolución del reloj del sistema, el TimerCallback delegado se ejecutará a intervalos definidos por la resolución del reloj del sistema, que es de aproximadamente 15 milisegundos en windows 7 y sistemas Windows 8. Puede cambiar el tiempo y el período de vencimiento, o deshabilitar el temporizador, mediante el Change método .

Nota

Siempre que use un Timer, debe mantener una referencia a él. Al igual que con cualquier objeto administrado, un Timer objeto está sujeto a la recolección de elementos no utilizados cuando no hay referencias a él. El hecho de que un elemento Timer todavía está activo no impide que se recopile.

Nota

El reloj del sistema que se usa es el mismo reloj utilizado por GetTickCount, que no se ve afectado por los cambios realizados con timeBeginPeriod y timeEndPeriod.

Cuando ya no se necesite un temporizador, use el Dispose método para liberar los recursos mantenidos por el temporizador. Tenga en cuenta que las devoluciones de llamada pueden producirse después de llamar a la sobrecarga del Dispose() método, porque el temporizador pone en cola devoluciones de llamada para su ejecución por subprocesos del grupo de subprocesos. Puede usar la sobrecarga del Dispose(WaitHandle) método para esperar hasta que se hayan completado todas las devoluciones de llamada.

El método de devolución de llamada ejecutado por el temporizador debe ser reentrant, ya que se llama a en ThreadPool subprocesos. La devolución de llamada se puede ejecutar simultáneamente en dos subprocesos del grupo de subprocesos si el intervalo del temporizador es menor que el tiempo necesario para ejecutar la devolución de llamada, o si todos los subprocesos del grupo de subprocesos están en uso y la devolución de llamada se pone en cola varias veces.

Nota

System.Threading.Timer es un temporizador sencillo y ligero que usa métodos de devolución de llamada y se sirve mediante subprocesos del grupo de subprocesos. No se recomienda usar con Windows Forms, ya que sus devoluciones de llamada no se producen en el subproceso de la interfaz de usuario. System.Windows.Forms.Timeres una mejor opción para su uso con Windows Forms. En el caso de la funcionalidad del temporizador basado en servidor, puede considerar el uso System.Timers.Timerde , que genera eventos y tiene características adicionales.

Constructores

Timer(TimerCallback)

Inicializa una nueva instancia de la clase Timer con un período y un tiempo límite infinitos, utilizando el objeto Timer recién creado como objeto de estado.

Timer(TimerCallback, Object, Int32, Int32)

Inicializa una nueva instancia de la clase Timer utilizando un entero de 32 bits con signo para medir los intervalos de tiempo.

Timer(TimerCallback, Object, Int64, Int64)

Inicializa una nueva instancia de la clase Timer utilizando un entero de 64 bits con signo para medir los intervalos de tiempo.

Timer(TimerCallback, Object, TimeSpan, TimeSpan)

Inicializa una nueva instancia de la clase Timer, utilizando valores de TimeSpan para medir los intervalos de tiempo.

Timer(TimerCallback, Object, UInt32, UInt32)

Inicializa una nueva instancia de la clase Timer utilizando un entero de 32 bits sin signo para medir los intervalos de tiempo.

Propiedades

ActiveCount

Obtiene el número de temporizadores que están activos actualmente. Un temporizador activo se ha registrado para sonar en un punto determinado del futuro y aún no se ha cancelado.

Métodos

Change(Int32, Int32)

Cambia el tiempo de inicio y el intervalo entre las distintas invocaciones de método para un temporizador, utilizando enteros de 32 bits con signo para medir los intervalos de tiempo.

Change(Int64, Int64)

Cambia el tiempo de inicio y el intervalo entre las distintas invocaciones de método para un temporizador, utilizando enteros de 64 bits con signo para medir los intervalos de tiempo.

Change(TimeSpan, TimeSpan)

Cambia el tiempo de inicio y el intervalo entre las distintas invocaciones del método para un temporizador, utilizando los valores de TimeSpan para medir los intervalos de tiempo.

Change(UInt32, UInt32)

Cambia el tiempo de inicio y el intervalo entre las distintas invocaciones de método para un temporizador, utilizando enteros de 32 bits sin signo para medir los intervalos de tiempo.

CreateObjRef(Type)

Crea un objeto que contiene toda la información relevante necesaria para generar un proxy utilizado para comunicarse con un objeto remoto.

(Heredado de MarshalByRefObject)
Dispose()

Libera todos los recursos utilizados por la instancia de Timer actual.

Dispose(WaitHandle)

Libera todos los recursos utilizados por la instancia de Timer actual e indica el momento en el que se ha eliminado el temporizador.

DisposeAsync()

Libera todos los recursos utilizados por la instancia de Timer actual.

Equals(Object)

Determina si el objeto especificado es igual que el objeto actual.

(Heredado de Object)
Finalize()

Permite que un objeto intente liberar recursos y realizar otras operaciones de limpieza antes de que sea reclamado por la recolección de elementos no utilizados.

GetHashCode()

Sirve como la función hash predeterminada.

(Heredado de Object)
GetLifetimeService()
Obsoletos.

Recupera el objeto de servicio de duración actual que controla la directiva de duración de esta instancia.

(Heredado de MarshalByRefObject)
GetType()

Obtiene el Type de la instancia actual.

(Heredado de Object)
InitializeLifetimeService()
Obsoletos.

Obtiene un objeto de servicio de duración para controlar la directiva de duración de esta instancia.

(Heredado de MarshalByRefObject)
MemberwiseClone()

Crea una copia superficial del Object actual.

(Heredado de Object)
MemberwiseClone(Boolean)

Crea una copia superficial del objeto MarshalByRefObject actual.

(Heredado de MarshalByRefObject)
ToString()

Devuelve una cadena que representa el objeto actual.

(Heredado de Object)

Métodos de extensión

ConfigureAwait(IAsyncDisposable, Boolean)

Configura la forma en la que se realizan las expresiones await en las tareas devueltas desde un elemento asincrónico descartable.

Se aplica a

Seguridad para subprocesos

Este tipo es seguro para la ejecución de subprocesos.

Consulte también