Timer Clase

Definición

Genera un evento después de un intervalo establecido, con la opción de generar eventos recurrentes.Generates an event after a set interval, with an option to generate recurring events.

public ref class Timer : System::ComponentModel::Component, System::ComponentModel::ISupportInitialize
public class Timer : System.ComponentModel.Component, System.ComponentModel.ISupportInitialize
type Timer = class
    inherit Component
    interface ISupportInitialize
Public Class Timer
Inherits Component
Implements ISupportInitialize
Herencia
Implementaciones

Ejemplos

En el ejemplo siguiente se crea System.Timers.Timer una instancia de un Timer.Elapsed objeto que desencadena su evento cada dos segundos (2.000 milisegundos), configura un controlador de eventos para el evento e inicia el temporizador.The following example instantiates a System.Timers.Timer object that fires its Timer.Elapsed event every two seconds (2,000 milliseconds), sets up an event handler for the event, and starts the timer. El controlador de eventos muestra el valor de ElapsedEventArgs.SignalTime la propiedad cada vez que se genera.The event handler displays the value of the ElapsedEventArgs.SignalTime property each time it is raised.

using System;
using System.Timers;

public class Example
{
   private static System.Timers.Timer aTimer;
   
   public static void Main()
   {
      SetTimer();

      Console.WriteLine("\nPress the Enter key to exit the application...\n");
      Console.WriteLine("The application started at {0:HH:mm:ss.fff}", DateTime.Now);
      Console.ReadLine();
      aTimer.Stop();
      aTimer.Dispose();
      
      Console.WriteLine("Terminating the application...");
   }

   private static void SetTimer()
   {
        // Create a timer with a two second interval.
        aTimer = new System.Timers.Timer(2000);
        // Hook up the Elapsed event for the timer. 
        aTimer.Elapsed += OnTimedEvent;
        aTimer.AutoReset = true;
        aTimer.Enabled = true;
    }

    private static void OnTimedEvent(Object source, ElapsedEventArgs e)
    {
        Console.WriteLine("The Elapsed event was raised at {0:HH:mm:ss.fff}",
                          e.SignalTime);
    }
}
// The example displays output like the following:
//       Press the Enter key to exit the application...
//
//       The application started at 09:40:29.068
//       The Elapsed event was raised at 09:40:31.084
//       The Elapsed event was raised at 09:40:33.100
//       The Elapsed event was raised at 09:40:35.100
//       The Elapsed event was raised at 09:40:37.116
//       The Elapsed event was raised at 09:40:39.116
//       The Elapsed event was raised at 09:40:41.117
//       The Elapsed event was raised at 09:40:43.132
//       The Elapsed event was raised at 09:40:45.133
//       The Elapsed event was raised at 09:40:47.148
//
//       Terminating the application...
Imports System.Timers

Public Module Example
    Private aTimer As System.Timers.Timer

    Public Sub Main()
        SetTimer()

      Console.WriteLine("{0}Press the Enter key to exit the application...{0}",
                        vbCrLf)
      Console.WriteLine("The application started at {0:HH:mm:ss.fff}",
                        DateTime.Now)
      Console.ReadLine()
      aTimer.Stop()
      aTimer.Dispose()

      Console.WriteLine("Terminating the application...")
    End Sub

    Private Sub SetTimer()
        ' Create a timer with a two second interval.
        aTimer = New System.Timers.Timer(2000)
        ' Hook up the Elapsed event for the timer. 
        AddHandler aTimer.Elapsed, AddressOf OnTimedEvent
        aTimer.AutoReset = True
        aTimer.Enabled = True
    End Sub

    ' The event handler for the Timer.Elapsed event. 
    Private Sub OnTimedEvent(source As Object, e As ElapsedEventArgs)
        Console.WriteLine("The Elapsed event was raised at {0:HH:mm:ss.fff}",
                          e.SignalTime)
    End Sub 
End Module
' The example displays output like the following:
'       Press the Enter key to exit the application...
'
'       The application started at 09:40:29.068
'       The Elapsed event was raised at 09:40:31.084
'       The Elapsed event was raised at 09:40:33.100
'       The Elapsed event was raised at 09:40:35.100
'       The Elapsed event was raised at 09:40:37.116
'       The Elapsed event was raised at 09:40:39.116
'       The Elapsed event was raised at 09:40:41.117
'       The Elapsed event was raised at 09:40:43.132
'       The Elapsed event was raised at 09:40:45.133
'       The Elapsed event was raised at 09:40:47.148
'
'       Terminating the application...

Comentarios

El Timer componente es un temporizador basado en servidor que genera un Elapsed evento en la aplicación después de que haya transcurrido el número Interval de milisegundos de la propiedad.The Timer component is a server-based timer that raises an Elapsed event in your application after the number of milliseconds in the Interval property has elapsed. Puede configurar el Timer objeto para que genere el evento una sola vez o de forma AutoReset repetida mediante la propiedad.You can configure the Timer object to raise the event just once or repeatedly using the AutoReset property. Normalmente, un Timer objeto se declara en el nivel de clase para que permanezca en el ámbito siempre que sea necesario.Typically, a Timer object is declared at the class level so that it stays in scope as long as it is needed. Después, puede controlar su Elapsed evento para proporcionar el procesamiento normal.You can then handle its Elapsed event to provide regular processing. Por ejemplo, supongamos que tiene un servidor crítico que debe mantenerse ejecutándose 24 horas al día, 7 días a la semana.For example, suppose you have a critical server that must be kept running 24 hours a day, 7 days a week. Puede crear un servicio que use un Timer objeto para comprobar periódicamente el servidor y asegurarse de que el sistema está en funcionamiento.You could create a service that uses a Timer object to periodically check the server and ensure that the system is up and running. Si el sistema no responde, el servicio podría intentar reiniciar el servidor o notificar a un administrador.If the system is not responding, the service could attempt to restart the server or notify an administrator.

Importante

La Timer clase no está disponible para todas las implementaciones y versiones de .net, como .net Standard 1,6 y versiones anteriores.The Timer class is not available for all .NET implementations and versions, such as .NET Standard 1.6 and lower versions. En estos casos, puede usar la System.Threading.Timer clase en su lugar.In these cases, you can use the System.Threading.Timer class instead.

Este tipo implementa la interfaz IDisposable.This type implements the IDisposable interface. Cuando haya terminado de utilizar el tipo, debe desecharlo directa o indirectamente.When you have finished using the type, you should dispose of it either directly or indirectly. Para eliminar el tipo directamente, llame a su método Dispose en un bloque try/catch.To dispose of the type directly, call its Dispose method in a try/catch block. Para deshacerse de él indirectamente, use una construcción de lenguaje como using (en C#) o Using (en Visual Basic).To dispose of it indirectly, use a language construct such as using (in C#) or Using (in Visual Basic). Para más información, vea la sección "Uso de objetos que implementan IDisposable" en el tema de la interfaz IDisposable.For more information, see the "Using an Object that Implements IDisposable" section in the IDisposable interface topic.

La clase basada System.Timers.Timer en servidor está diseñada para su uso con subprocesos de trabajo en un entorno multiproceso.The server-based System.Timers.Timer class is designed for use with worker threads in a multithreaded environment. Los temporizadores de servidor pueden moverse entre los subprocesos para controlar el evento generado Elapsed , lo que da como resultado más precisión que los temporizadores de Windows para generar el evento a tiempo.Server timers can move among threads to handle the raised Elapsed event, resulting in more accuracy than Windows timers in raising the event on time.

El System.Timers.Timer componente genera el Elapsed evento, en función del valor (en milisegundos) de la Interval propiedad.The System.Timers.Timer component raises the Elapsed event, based on the value (in milliseconds) of the Interval property. Puede controlar este evento para realizar el procesamiento que necesite.You can handle this event to perform the processing you need. Por ejemplo, supongamos que tiene una aplicación de ventas en línea que publica continuamente pedidos de venta en una base de datos.For example, suppose that you have an online sales application that continuously posts sales orders to a database. El servicio que compila las instrucciones para el envío funciona en un lote de pedidos en lugar de procesar cada pedido de forma individual.The service that compiles the instructions for shipping operates on a batch of orders rather than processing each order individually. Puede usar Timer para iniciar el procesamiento por lotes cada 30 minutos.You could use a Timer to start the batch processing every 30 minutes.

Importante

La clase System. Timers. Timer tiene la misma resolución que el reloj del sistema.The System.Timers.Timer class has the same resolution as the system clock. Esto significa que el Elapsed evento se activará en un intervalo definido por la resolución del reloj del sistema si Interval la propiedad es menor que la resolución del reloj del sistema.This means that the Elapsed event will fire at an interval defined by the resolution of the system clock if the Interval property is less than the resolution of the system clock. Para obtener más información, vea la propiedad Interval.For more information, see the Interval property.

Cuando AutoReset se establece en false, un System.Timers.Timer objeto genera el Elapsed evento solo una vez, después de Interval que el primero haya transcurrido.When AutoReset is set to false, a System.Timers.Timer object raises the Elapsed event only once, after the first Interval has elapsed. Para seguir generando Elapsed el evento con regularidad en el intervalo definido Intervalpor el AutoReset , trueestablezca en, que es el valor predeterminado.To keep raising the Elapsed event regularly at the interval defined by the Interval, set AutoReset to true, which is the default value.

El Timer componente detecta y suprime todas las excepciones producidas por los controladores de eventos Elapsed para el evento.The Timer component catches and suppresses all exceptions thrown by event handlers for the Elapsed event. Este comportamiento está sujeto a cambios en versiones futuras del .NET Framework.This behavior is subject to change in future releases of the .NET Framework. Sin embargo, tenga en cuenta que esto no es cierto para los controladores de eventos que se ejecutan de forma C#asincrónica e incluyen Await el await operador (en) o el operador (en Visual Basic).Note, however, that this is not true of event handlers that execute asynchronously and include the await operator (in C#) or the Await operator (in Visual Basic). Las excepciones producidas en estos controladores de eventos se propagan de nuevo al subproceso que realiza la llamada, como se muestra en el ejemplo siguiente.Exceptions thrown in these event handlers are propagated back to the calling thread, as the following example illustrates. Para obtener más información sobre las excepciones que se producen en métodos asincrónicos, vea control de excepciones.For more information on exceptions thrown in asynchronous methods, see Exception Handling.

using System;
using System.Threading.Tasks;
using System.Timers;

class Example
{
   static void Main()
   {
      Timer timer = new Timer(1000);
      timer.Elapsed += async ( sender, e ) => await HandleTimer();
      timer.Start();
      Console.Write("Press any key to exit... ");
      Console.ReadKey();
   }

   private static Task HandleTimer()
   {
     Console.WriteLine("\nHandler not implemented..." );
     throw new NotImplementedException();
   }
}
// The example displays output like the following:
//   Press any key to exit...
//   Handler not implemented...
//   
//   Unhandled Exception: System.NotImplementedException: The method or operation is not implemented.
//      at Example.HandleTimer()
//      at Example.<<Main>b__0>d__2.MoveNext()
//   --- End of stack trace from previous location where exception was thrown ---
//      at System.Runtime.CompilerServices.AsyncMethodBuilderCore.<>c__DisplayClass2.<ThrowAsync>b__5(Object state)
//      at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
//      at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
//      at System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()
//      at System.Threading.ThreadPoolWorkQueue.Dispatch()
Imports System.Threading.Tasks
Imports System.Timers

Public Module Example
   Public Sub Main()
      Dim timer As New Timer(1000)  
      AddHandler timer.Elapsed, AddressOf Example.HandleTimer     
      'timer.Elapsed = Async ( sender, e ) => await HandleTimer()
      timer.Start()
      Console.Write("Press any key to exit... ")
      Console.ReadKey()
   End Sub

   Private Async Sub HandleTimer(sender As Object, e As EventArgs)
      Await Task.Run(Sub()
                        Console.WriteLine()
                        Console.WriteLine("Handler not implemented..." )
                        Throw New NotImplementedException()
                     End Sub)   
   End Sub
End Module
' The example displays output like the following:
'   Press any key to exit...
'   Handler not implemented...
'   
'   Unhandled Exception: System.NotImplementedException: The method or operation is not implemented.
'      at Example._Lambda$__1()
'      at System.Threading.Tasks.Task.Execute()
'   --- End of stack trace from previous location where exception was thrown ---
'      at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
'      at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
'      at Example.VB$StateMachine_0_HandleTimer.MoveNext()
'   --- End of stack trace from previous location where exception was thrown ---
'      at System.Runtime.CompilerServices.AsyncMethodBuilderCore.<>c__DisplayClass2.<ThrowAsync>b__5(Object state)
'      at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
'      at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
'      at System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()
'      at System.Threading.ThreadPoolWorkQueue.Dispatch()

Si la SynchronizingObject propiedad es null, el Elapsed evento se genera en un ThreadPool subproceso.If the SynchronizingObject property is null, the Elapsed event is raised on a ThreadPool thread. Si el Elapsed procesamiento del evento dura más que Interval, el evento se podría producir de nuevo en ThreadPool otro subproceso.If processing of the Elapsed event lasts longer than Interval, the event might be raised again on another ThreadPool thread. En esta situación, el controlador de eventos debe ser reentrante.In this situation, the event handler should be reentrant.

Nota

El método de control de eventos puede ejecutarse en un subproceso al mismo tiempo que otro subproceso llama al Stop método o establece la Enabled propiedad en false.The event-handling method might run on one thread at the same time that another thread calls the Stop method or sets the Enabled property to false. Esto puede dar lugar a Elapsed que se produzca el evento después de que se detenga el temporizador.This might result in the Elapsed event being raised after the timer is stopped. El código de ejemplo del Stop método muestra una manera de evitar esta condición de carrera.The example code for the Stop method shows one way to avoid this race condition.

Incluso si SynchronizingObject no nulles, Elapsed los eventos pueden producirse Dispose después de que se haya llamado al método Enabled o Stop o después de que falsela propiedad se haya establecido en, porque la señal para provocar el eventoElapsed el evento siempre se pone en cola para su ejecución en un subproceso del grupo de subprocesos.Even if SynchronizingObject is not null, Elapsed events can occur after the Dispose or Stop method has been called or after the Enabled property has been set to false, because the signal to raise the Elapsed event is always queued for execution on a thread pool thread. Una manera de resolver esta condición de carrera es establecer una marca que indique al controlador de eventos que Elapsed el evento omita los eventos subsiguientes.One way to resolve this race condition is to set a flag that tells the event handler for the Elapsed event to ignore subsequent events.

Si usa la System.Timers.Timer clase con un elemento de la interfaz de usuario, como un formulario o un control, sin colocar el temporizador en ese elemento de la interfaz de usuario, asigne el formulario o el SynchronizingObject control que contiene el Timer objeto a la propiedad, de modo que el evento sea serialización en el subproceso de la interfaz de usuario.If you use the System.Timers.Timer class with a user interface element, such as a form or control, without placing the timer on that user interface element, assign the form or control that contains the Timer to the SynchronizingObject property, so that the event is marshaled to the user interface thread.

Para obtener una lista de los valores de propiedad predeterminados para una Timer instancia de Timer, vea el constructor.For a list of default property values for an instance of Timer, see the Timer constructor.

Sugerencia

Tenga en cuenta que .net incluye cuatro clases Timerdenominadas, cada una de las cuales ofrece una funcionalidad diferente:Be aware that .NET includes four classes named Timer, each of which offers different functionality:

  • System.Timers.Timer(este tema): activa un evento a intervalos regulares.System.Timers.Timer (this topic): fires an event 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: ejecuta un único método de devolución de llamada en un subproceso de grupo de subprocesos a intervalos regulares.System.Threading.Timer: 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): componente de Windows Forms que desencadena un evento a intervalos regulares.System.Windows.Forms.Timer (.NET Framework only): a Windows Forms component that fires an event at regular intervals. El componente no tiene interfaz de usuario y está diseñado para su uso en un entorno de un único subproceso.The component has no user interface and is designed for use in a single-threaded environment.
  • System.Web.UI.Timer(Solo .NET Framework): 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.

Constructores

Timer()

Inicializa una nueva instancia de la clase Timer y establece todas las propiedades en sus valores iniciales.Initializes a new instance of the Timer class, and sets all the properties to their initial values.

Timer(Double)

Inicializa una nueva instancia de la clase Timer y establece la propiedad Interval en el número de milisegundos especificado.Initializes a new instance of the Timer class, and sets the Interval property to the specified number of milliseconds.

Propiedades

AutoReset

Obtiene o establece un valor booleano que indica si Timer debe generar el evento Elapsed solo una vez (false) o repetidamente (true).Gets or sets a Boolean indicating whether the Timer should raise the Elapsed event only once (false) or repeatedly (true).

CanRaiseEvents

Obtiene un valor que indica si el componente puede generar un evento.Gets a value indicating whether the component can raise an event.

(Heredado de Component)
Container

Obtiene IContainer que contiene Component.Gets the IContainer that contains the Component.

(Heredado de Component)
DesignMode

Obtiene un valor que indica si Component está actualmente en modo de diseño.Gets a value that indicates whether the Component is currently in design mode.

(Heredado de Component)
Enabled

Obtiene o establece un valor que indica si Timer debe generar el evento Elapsed.Gets or sets a value indicating whether the Timer should raise the Elapsed event.

Events

Obtiene la lista de controladores de eventos asociados a Component.Gets the list of event handlers that are attached to this Component.

(Heredado de Component)
Interval

Obtiene o establece el intervalo, expresado en milisegundos, en el que se generará el evento Elapsed.Gets or sets the interval, expressed in milliseconds, at which to raise the Elapsed event.

Site

Obtiene o establece el sitio que enlaza el objeto Timer a su contenedor en modo de diseño.Gets or sets the site that binds the Timer to its container in design mode.

SynchronizingObject

Obtiene o establece el objeto que se utiliza para calcular las referencias de las llamadas del controlador de eventos que se emiten al transcurrir un intervalo.Gets or sets the object used to marshal event-handler calls that are issued when an interval has elapsed.

Métodos

BeginInit()

Comienza la inicialización en tiempo de ejecución de un objeto Timer que se usa en un formulario o que lo usa otro componente.Begins the run-time initialization of a Timer that is used on a form or by another component.

Close()

Libera los recursos que usa Timer.Releases the resources used by the Timer.

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.

(Heredado de MarshalByRefObject)
Dispose()

Libera todos los recursos que usa Component.Releases all resources used by the Component.

(Heredado de Component)
Dispose(Boolean)

Libera todos los recursos que usa la clase Timer actual.Releases all resources used by the current Timer.

EndInit()

Finaliza la inicialización en tiempo de ejecución de un objeto Timer que se usa en un formulario o que lo usa otro componente.Ends the run-time initialization of a Timer that is used on a form or by another component.

Equals(Object)

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

(Heredado de Object)
GetHashCode()

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

(Heredado de Object)
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.

(Heredado de MarshalByRefObject)
GetService(Type)

Devuelve un objeto que representa el servicio suministrado por Component o por Container.Returns an object that represents a service provided by the Component or by its Container.

(Heredado de Component)
GetType()

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

(Heredado de Object)
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.

(Heredado de MarshalByRefObject)
MemberwiseClone()

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

(Heredado de Object)
MemberwiseClone(Boolean)

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

(Heredado de MarshalByRefObject)
Start()

Empieza a generar el evento Elapsed al establecer Enabled en true.Starts raising the Elapsed event by setting Enabled to true.

Stop()

Deja de generar el evento Elapsed al establecer Enabled en false.Stops raising the Elapsed event by setting Enabled to false.

ToString()

Devuelve una String que contiene el nombre del Component, si existe.Returns a String containing the name of the Component, if any. Este método no se debe invalidar.This method should not be overridden.

(Heredado de Component)

Eventos

Disposed

Se produce cuando el componente se elimina mediante una llamada al método Dispose().Occurs when the component is disposed by a call to the Dispose() method.

(Heredado de Component)
Elapsed

Se produce cuando transcurre el intervalo.Occurs when the interval elapses.

Se aplica a

Seguridad para subprocesos

Los miembros static públicos de este tipo son seguros para subprocesos.Any public static members of this type are thread safe. No se garantiza que los miembros de instancias sean seguros para la ejecución de subprocesos.Any instance members are not guaranteed to be thread safe.

Consulte también: