Timer Timer Timer Timer Class

Definición

Proporciona un mecanismo para ejecutar un método en un subproceso del grupo de subprocesos en intervalos especificados.Provides a mechanism for executing a method on a thread pool thread at specified intervals. Esta clase no puede heredarse.This class cannot be inherited.

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

Ejemplos

En el ejemplo siguiente se StatusChecker define una clase que CheckStatus incluye un método cuya firma es la misma TimerCallback que el delegado.The following example defines a StatusChecker class that includes a CheckStatus method whose signature is the same as the TimerCallback delegate. El state argumento AutoResetEvent del método es un objeto que se utiliza para sincronizar el subproceso de la aplicación y el subproceso del grupo de subprocesos que ejecuta el delegado de devolución de llamada. CheckStatusThe state argument of the CheckStatus method is an AutoResetEvent object that is used to synchronize the application thread and the thread pool thread that executes the callback delegate. La StatusChecker clase también incluye dos variables de estado:The StatusChecker class also includes two state variables:

invokeCount
Indica el número de veces que se ha invocado el método de devolución de llamada.Indicates the number of times the callback method has been invoked.

maxCount
Determina el número máximo de veces que se debe invocar el método de devolución de llamada.Determines the maximum number of times the callback method should be invoked.

El subproceso de aplicación crea el temporizador, que espera un segundo y, a continuación CheckStatus , ejecuta el método de devolución de llamada cada 250 milisegundos.The application thread creates the timer, which waits one second and then executes the CheckStatus callback method every 250 milliseconds. A continuación, el subproceso de AutoResetEvent la aplicación se bloquea hasta que se señala el objeto.The application thread then blocks until the AutoResetEvent object is signaled. Cuando el CheckStatus método de devolución de maxCount llamada se ejecuta veces, AutoResetEvent.Set llama al método para establecer el estado AutoResetEvent del objeto en señalado.When the CheckStatus callback method executes maxCount times, it calls the AutoResetEvent.Set method to set the state of the AutoResetEvent object to signaled. La primera vez que esto ocurre, el subproceso de Change(Int32, Int32) la aplicación llama al método para que el método de devolución de llamada se ejecute ahora cada medio segundo.The first time this happens, the application thread calls the Change(Int32, Int32) method so that the callback method now executes every half second. Una vez más se bloquea hasta AutoResetEvent que se señala el objeto.It once again blocks until the AutoResetEvent object is signaled. Cuando esto sucede, el temporizador se destruye llamando a su Dispose método y finaliza la aplicación.When this happens, the timer is destroyed by calling its Dispose method, and the application terminates.

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 Timer desea que ejecute.Use a TimerCallback delegate to specify the method you want the Timer to execute. La firma del TimerCallback delegado es:The signature of the TimerCallback delegate is:

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

El delegado Timer se especifica cuando se construye el temporizador y no se puede cambiar.The timer delegate is specified when the timer is constructed, and cannot be changed. El método no se ejecuta en el subproceso que creó el temporizador; se ejecuta en un ThreadPool subproceso proporcionado por el sistema.The method does not execute on the thread that created the timer; it executes on a ThreadPool thread supplied by the system.

Sugerencia

.Net incluye cuatro clases denominadas Timer, cada una de las cuales ofrece una funcionalidad diferente:.NET includes four classes named Timer, each of which offers different functionality:

  • System.Timers.Timer, que desencadena un evento y ejecuta el código en uno o varios receptores de eventos a intervalos regulares.System.Timers.Timer, which fires an event and executes the code in one or more event sinks at regular intervals. La clase está pensada para su uso como componente basado en servidor o servicio en un entorno multiproceso. no tiene ninguna interfaz de usuario y no es visible en tiempo de ejecución.The class is intended for use as a server-based or service component in a multithreaded environment; it has no user interface and is not visible at runtime.
  • System.Threading.Timer, que ejecuta un único método de devolución de llamada en un subproceso de grupo de subprocesos a intervalos regulares.System.Threading.Timer, which executes a single callback method on a thread pool thread at regular intervals. El método de devolución de llamada se define cuando se crea una instancia del temporizador y no se puede cambiar.The callback method is defined when the timer is instantiated and cannot be changed. Al igual System.Timers.Timer que la clase, esta clase está pensada para su uso como componente basado en servidor o servicio en un entorno multiproceso; no tiene interfaz de usuario y no es visible en tiempo de ejecución.Like the System.Timers.Timer class, this class is intended for use as a server-based or service component in a multithreaded environment; it has no user interface and is not visible at runtime.
  • System.Windows.Forms.Timer(Solo .NET Framework), un componente de Windows Forms que desencadena un evento y ejecuta el código en uno o varios receptores de eventos a intervalos regulares.System.Windows.Forms.Timer (.NET Framework only), a Windows Forms component that fires an event and executes the code in one or more event sinks at regular intervals. 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 la interfaz de usuario.The component has no user interface and is designed for use in a single-threaded environment; it executes on the UI thread.
  • System.Web.UI.Timer(Solo .NET Framework), un componente ASP.NET que realiza postbacks de página web asincrónicos o sincrónicos a intervalos regulares.System.Web.UI.Timer (.NET Framework only), an ASP.NET component that performs asynchronous or synchronous web page postbacks at a regular interval.

Al crear un temporizador, puede especificar una cantidad de tiempo de espera antes de la primera ejecución del método (tiempo de espera) y una cantidad de tiempo de espera entre las ejecuciones posteriores (período).When you create a timer, you can specify an amount of time to wait before the first execution of the method (due time), and an amount of time to wait between subsequent executions (period). La Timer clase tiene la misma resolución que el reloj del sistema.The Timer class has the same resolution as the system clock. Esto significa que, si el período es menor que la resolución del reloj del sistema, TimerCallback el delegado se ejecutará a intervalos definidos por la resolución del reloj del sistema, que es aproximadamente 15 milisegundos en los sistemas Windows 7 y Windows 8.This means that if the period is less than the resolution of the system clock, the TimerCallback delegate will execute at intervals defined by the resolution of the system clock, which is approximately 15 milliseconds on Windows 7 and Windows 8 systems. Puede cambiar la hora y el período de vencimiento, o deshabilitar el temporizador mediante el Change método.You can change the due time and period, or disable the timer, by using the Change method.

Nota

Siempre que use Timer, debe mantener una referencia a él.As long as you are using a Timer, you must keep a reference to it. Como con cualquier objeto administrado, está Timer sujeto a la recolección de elementos no utilizados cuando no hay ninguna referencia a él.As with any managed object, a Timer is subject to garbage collection when there are no references to it. El hecho de que Timer un todavía esté activo no impide que se recopile.The fact that a Timer is still active does not prevent it from being collected.

Cuando ya no se necesite un temporizador, use el Dispose método para liberar los recursos mantenidos por el temporizador.When a timer is no longer needed, use the Dispose method to free the resources held by the timer. Tenga en cuenta que las devoluciones Dispose() de llamada pueden producirse después de llamar a la sobrecarga del método, porque el temporizador pone en cola las devoluciones de llamada para su ejecución por subprocesos del grupoNote that callbacks can occur after the Dispose() method overload has been called, because the timer queues callbacks for execution by thread pool threads. Puede usar la sobrecarga Dispose(WaitHandle) del método para esperar hasta que se hayan completado todas las devoluciones de llamada.You can use the Dispose(WaitHandle) method overload to wait until all callbacks have completed.

El método de devolución de llamada ejecutado por el temporizador debe ser reentrante, porque ThreadPool se llama en subprocesos.The callback method executed by the timer should be reentrant, because it is called on ThreadPool threads. La devolución de llamada se puede ejecutar simultáneamente en dos subprocesos de 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.The callback can be executed simultaneously on two thread pool threads if the timer interval is less than the time required to execute the callback, or if all thread pool threads are in use and the callback is queued multiple times.

Nota

System.Threading.Timeres un temporizador simple y ligero que utiliza métodos de devolución de llamada y se sirve de subprocesos del grupo de subprocesos.System.Threading.Timer is a simple, lightweight timer that uses callback methods and is served by thread pool threads. No se recomienda su uso con Windows Forms, porque sus devoluciones de llamada no se producen en el subproceso de la interfaz de usuario.It is not recommended for use with Windows Forms, because its callbacks do not occur on the user interface thread. System.Windows.Forms.Timeres una opción mejor para su uso con Windows Forms.System.Windows.Forms.Timer is a better choice for use with Windows Forms. Para la funcionalidad del temporizador basado en servidor, puede considerar System.Timers.Timerel uso de, que genera eventos y tiene características adicionales.For server-based timer functionality, you might consider using System.Timers.Timer, which raises events and has additional features.

Constructores

Timer(TimerCallback) Timer(TimerCallback) Timer(TimerCallback) 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.Initializes a new instance of the Timer class with an infinite period and an infinite due time, using the newly created Timer object as the state object.

Timer(TimerCallback, Object, Int32, Int32) Timer(TimerCallback, Object, Int32, Int32) Timer(TimerCallback, Object, Int32, Int32) 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.Initializes a new instance of the Timer class, using a 32-bit signed integer to specify the time interval.

Timer(TimerCallback, Object, Int64, Int64) Timer(TimerCallback, Object, Int64, Int64) Timer(TimerCallback, Object, Int64, Int64) 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.Initializes a new instance of the Timer class, using 64-bit signed integers to measure time intervals.

Timer(TimerCallback, Object, TimeSpan, TimeSpan) Timer(TimerCallback, Object, TimeSpan, TimeSpan) Timer(TimerCallback, Object, TimeSpan, TimeSpan) Timer(TimerCallback, Object, TimeSpan, TimeSpan)

Inicializa una nueva instancia de la clase Timer, utilizando valores de TimeSpan para medir los intervalos de tiempo.Initializes a new instance of the Timer class, using TimeSpan values to measure time intervals.

Timer(TimerCallback, Object, UInt32, UInt32) Timer(TimerCallback, Object, UInt32, UInt32) Timer(TimerCallback, Object, UInt32, UInt32) 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.Initializes a new instance of the Timer class, using 32-bit unsigned integers to measure time intervals.

Propiedades

ActiveCount ActiveCount ActiveCount ActiveCount

Obtiene el número de temporizadores que están activos actualmente.Gets the number of timers that are currently active. Un temporizador activo se ha registrado para sonar en un punto determinado del futuro y aún no se ha cancelado.An active timer is registered to tick at some point in the future, and has not yet been canceled.

Métodos

Change(Int32, Int32) Change(Int32, Int32) Change(Int32, Int32) 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.Changes the start time and the interval between method invocations for a timer, using 32-bit signed integers to measure time intervals.

Change(Int64, Int64) Change(Int64, Int64) Change(Int64, Int64) 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.Changes the start time and the interval between method invocations for a timer, using 64-bit signed integers to measure time intervals.

Change(TimeSpan, TimeSpan) Change(TimeSpan, TimeSpan) Change(TimeSpan, TimeSpan) 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.Changes the start time and the interval between method invocations for a timer, using TimeSpan values to measure time intervals.

Change(UInt32, UInt32) Change(UInt32, UInt32) Change(UInt32, UInt32) 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.Changes the start time and the interval between method invocations for a timer, using 32-bit unsigned integers to measure time intervals.

CreateObjRef(Type) CreateObjRef(Type) CreateObjRef(Type) CreateObjRef(Type)

Crea un objeto que contiene toda la información relevante necesaria para generar un proxy utilizado para comunicarse con un objeto remoto.Creates an object that contains all the relevant information required to generate a proxy used to communicate with a remote object.

(Inherited from MarshalByRefObject)
Dispose() Dispose() Dispose() Dispose()

Libera todos los recursos utilizados por la instancia de Timer actual.Releases all resources used by the current instance of Timer.

Dispose(WaitHandle) Dispose(WaitHandle) Dispose(WaitHandle) 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.Releases all resources used by the current instance of Timer and signals when the timer has been disposed of.

DisposeAsync() DisposeAsync() DisposeAsync() DisposeAsync()

Libera todos los recursos utilizados por la instancia de Timer actual.Releases all resources used by the current instance of Timer.

Equals(Object) Equals(Object) Equals(Object) Equals(Object)

Determina si el objeto especificado es igual al objeto actual.Determines whether the specified object is equal to the current object.

(Inherited from Object)
Finalize() Finalize() Finalize() 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.Allows an object to try to free resources and perform other cleanup operations before it is reclaimed by garbage collection.

GetHashCode() GetHashCode() GetHashCode() GetHashCode()

Sirve como la función hash predeterminada.Serves as the default hash function.

(Inherited from Object)
GetLifetimeService() GetLifetimeService() GetLifetimeService() GetLifetimeService()

Recupera el objeto de servicio de duración actual que controla la directiva de duración de esta instancia.Retrieves the current lifetime service object that controls the lifetime policy for this instance.

(Inherited from MarshalByRefObject)
GetType() GetType() GetType() GetType()

Obtiene el Type de la instancia actual.Gets the Type of the current instance.

(Inherited from Object)
InitializeLifetimeService() InitializeLifetimeService() InitializeLifetimeService() InitializeLifetimeService()

Obtiene un objeto de servicio de duración para controlar la directiva de duración de esta instancia.Obtains a lifetime service object to control the lifetime policy for this instance.

(Inherited from MarshalByRefObject)
MemberwiseClone() MemberwiseClone() MemberwiseClone() MemberwiseClone()

Crea una copia superficial del objeto Object actual.Creates a shallow copy of the current Object.

(Inherited from Object)
MemberwiseClone(Boolean) MemberwiseClone(Boolean) MemberwiseClone(Boolean) MemberwiseClone(Boolean)

Crea una copia superficial del objeto MarshalByRefObject actual.Creates a shallow copy of the current MarshalByRefObject object.

(Inherited from MarshalByRefObject)
ToString() ToString() ToString() ToString()

Devuelve una cadena que representa el objeto actual.Returns a string that represents the current object.

(Inherited from Object)

Se aplica a

Seguridad para subprocesos

Este tipo es seguro para la ejecución de subprocesos.This type is thread safe.

Consulte también: