Partager via


Timer Classe

Définition

Génère un événement après un intervalle défini, avec une option permettant de générer des événements périodiques.

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
Héritage
Implémente

Exemples

L’exemple suivant instancie un System.Timers.Timer objet qui déclenche son Timer.Elapsed événement toutes les deux secondes (2 000 millisecondes), configure un gestionnaire d’événements pour l’événement et démarre le minuteur. Le gestionnaire d’événements affiche la valeur de la ElapsedEventArgs.SignalTime propriété chaque fois qu’elle est déclenchée.

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...
open System
open System.Timers

let onTimedEvent source (e: ElapsedEventArgs) =
    printfn $"""The Elapsed event was raised at {e.SignalTime.ToString "HH:mm:ss.fff"}"""

// Create a timer with a two second interval.
let aTimer = new Timer 2000
// Hook up the Elapsed event for the timer. 
aTimer.Elapsed.AddHandler onTimedEvent
aTimer.AutoReset <- true
aTimer.Enabled <- true

printfn "\nPress the Enter key to exit the application...\n"
printfn $"""The application started at {DateTime.Now.ToString "HH:mm:ss.fff"}"""
stdin.ReadLine() |> ignore
aTimer.Stop()
aTimer.Dispose()

printfn "Terminating the application..."

// 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...

Remarques

Le Timer composant est un minuteur basé sur le serveur qui déclenche un Elapsed événement dans votre application une fois que le nombre de millisecondes de la Interval propriété s’est écoulé. Vous pouvez configurer l’objet pour déclencher l’événement Timer une seule fois ou plusieurs fois à l’aide de la AutoReset propriété. En règle générale, un Timer objet est déclaré au niveau de la classe afin qu’il reste dans l’étendue tant qu’il est nécessaire. Vous pouvez ensuite gérer son Elapsed événement pour fournir un traitement régulier. Par exemple, supposons que vous disposez d’un serveur critique qui doit être maintenu en cours d’exécution 24 heures par jour, 7 jours par semaine. Vous pouvez créer un service qui utilise un Timer objet pour vérifier régulièrement le serveur et vérifier que le système est opérationnel. Si le système ne répond pas, le service peut tenter de redémarrer le serveur ou de notifier un administrateur.

Important

La Timer classe n’est pas disponible pour toutes les implémentations et versions .NET, telles que .NET Standard 1.6 et versions antérieures. Dans ces cas, vous pouvez utiliser la classe à la System.Threading.Timer place.

Ce type implémente l’interface IDisposable . Une fois que vous avez fini d’utiliser le type, vous devez le supprimer directement ou indirectement. Pour supprimer directement le type, appelez sa Dispose méthode dans un try/catch bloc. Pour la supprimer indirectement, utilisez une construction de langage telle que using (en C#) ou Using (en Visual Basic). Pour plus d’informations, consultez la section « Utilisation d’un objet implémentant IDisposable » dans la rubrique d’interface IDisposable .

La classe basée sur System.Timers.Timer le serveur est conçue pour être utilisée avec des threads de travail dans un environnement multithread. Les minuteurs de serveur peuvent passer d’un thread à l’autre pour gérer l’événement déclenché Elapsed , ce qui entraîne une précision supérieure à celle des minuteurs Windows pour déclencher l’événement à l’heure.

Le System.Timers.Timer composant déclenche l’événement Elapsed , en fonction de la valeur (en millisecondes) de la Interval propriété. Vous pouvez gérer cet événement pour effectuer le traitement dont vous avez besoin. Par exemple, supposons que vous disposez d’une application de vente en ligne qui publie en permanence des commandes commerciales dans une base de données. Le service qui compile les instructions d’expédition fonctionne sur un lot de commandes plutôt que de traiter chaque commande individuellement. Vous pouvez utiliser un Timer pour démarrer le traitement par lots toutes les 30 minutes.

Important

La classe System.Timers.Timer a la même résolution que l’horloge système. Cela signifie que l’événement Elapsed se déclenche à un intervalle défini par la résolution de l’horloge système si la Interval propriété est inférieure à la résolution de l’horloge système. Pour plus d’informations, consultez la propriété Interval.

Note

L’horloge système utilisée est la même horloge utilisée par GetTickCount, qui n’est pas affectée par les modifications apportées avec timeBeginPeriod et timeEndPeriod.

Lorsqu’il AutoReset est défini falsesur , un System.Timers.Timer objet déclenche l’événement Elapsed une seule fois, une fois que le premier Interval s’est écoulé. Pour continuer à déclencher l’événement Elapsed régulièrement à l’intervalle défini par le Intervalparamètre , défini AutoResettruesur , qui est la valeur par défaut.

Le Timer composant intercepte et supprime toutes les exceptions levées par les gestionnaires d’événements pour l’événement Elapsed . Ce comportement est susceptible de changer dans les versions ultérieures du .NET Framework. Notez toutefois que cela n’est pas vrai pour les gestionnaires d’événements qui s’exécutent de manière asynchrone et incluent l’opérateur await (en C#) ou l’opérateur Await (en Visual Basic). Les exceptions levées dans ces gestionnaires d’événements sont propagées au thread appelant, comme l’illustre l’exemple suivant. Pour plus d’informations sur les exceptions levées dans des méthodes asynchrones, consultez Gestion des exceptions.

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()
open System
open System.Threading.Tasks
open System.Timers

let handleTimer () =
    printfn "\nHandler not implemented..."
    raise (NotImplementedException()): Task

let timer = new Timer 1000
timer.Elapsed.AddHandler(fun sender e -> task { do! handleTimer () } |> ignore)
timer.Start()
printf "Press any key to exit... "
Console.ReadKey() |> ignore

// 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 propriété est null, l’événement Elapsed est déclenché sur un ThreadPool thread. Si le traitement de l’événement Elapsed dure plus longtemps que Interval, l’événement peut être déclenché à nouveau sur un autre ThreadPool thread. Dans ce cas, le gestionnaire d’événements doit être reentrant.

Note

La méthode de gestion des événements peut s’exécuter sur un thread en même temps qu’un autre thread appelle la Stop méthode ou définit la Enabled propriété falsesur . Cela peut entraîner l’arrêt de l’événement Elapsed après l’arrêt du minuteur. L’exemple de code de la Stop méthode montre une façon d’éviter cette condition de concurrence.

Même si SynchronizingObject ce n’est pas nullle cas, Elapsed les événements peuvent se produire après l’appel ou la DisposeStop méthode ou une fois la Enabled propriété définie falsesur , car le signal pour déclencher l’événement Elapsed est toujours mis en file d’attente pour l’exécution sur un thread de pool de threads. Une façon de résoudre cette condition de concurrence consiste à définir un indicateur qui indique au gestionnaire d’événements que l’événement Elapsed doit ignorer les événements suivants.

Si vous utilisez la System.Timers.Timer classe avec un élément d’interface utilisateur, tel qu’un formulaire ou un contrôle, sans placer le minuteur sur cet élément d’interface utilisateur, affectez le formulaire ou le contrôle qui contient la TimerSynchronizingObject propriété, afin que l’événement soit marshalé au thread d’interface utilisateur.

Pour obtenir la liste des valeurs de propriété par défaut d’une instance de Timer, consultez le Timer constructeur.

Conseil / Astuce

.NET comprend quatre classes nommées Timer, chacune offrant des fonctionnalités différentes :

  • System.Timers.Timer (cette rubrique) : déclenche un événement à intervalles réguliers. La classe est destinée à être utilisée en tant que composant de service ou basé sur un serveur dans un environnement multithread ; elle n’a pas d’interface utilisateur et n’est pas visible au moment de l’exécution.
  • System.Threading.Timer: exécute une méthode de rappel unique sur un thread de pool de threads à intervalles réguliers. La méthode de rappel est définie lorsque le minuteur est instancié et ne peut pas être modifié. Comme la System.Timers.Timer classe, cette classe est destinée à être utilisée en tant que composant de service ou basé sur un serveur dans un environnement multithread ; elle n’a pas d’interface utilisateur et n’est pas visible au moment de l’exécution.
  • System.Windows.Forms.Timer: composant Windows Forms qui déclenche un événement à intervalles réguliers. Le composant n’a pas d’interface utilisateur et est conçu pour une utilisation dans un environnement monothread.
  • System.Web.UI.Timer (.NET Framework uniquement) : composant ASP.NET qui effectue des publications de pages web asynchrones ou synchrones à intervalles réguliers.

Constructeurs

Nom Description
Timer()

Initialise une nouvelle instance de la Timer classe et définit toutes les propriétés sur leurs valeurs initiales.

Timer(Double)

Initialise une nouvelle instance de la Timer classe et définit la Interval propriété sur le nombre spécifié de millisecondes.

Timer(TimeSpan)

Initialise une nouvelle instance de la Timer classe, en définissant la Interval propriété sur la période spécifiée.

Propriétés

Nom Description
AutoReset

Obtient ou définit une valeur booléenne indiquant si l’événement TimerElapsed doit être levée une seule fois (false) ou à plusieurs reprises (true).

CanRaiseEvents

Obtient une valeur indiquant si le composant peut déclencher un événement.

(Hérité de Component)
Container

Obtient le IContainer fichier qui contient le Component.

(Hérité de Component)
DesignMode

Obtient une valeur qui indique si la Component valeur est actuellement en mode création.

(Hérité de Component)
Enabled

Obtient ou définit une valeur indiquant si la Timer valeur doit déclencher l’événement Elapsed .

Events

Obtient la liste des gestionnaires d’événements qui sont attachés à ce Component.

(Hérité de Component)
Interval

Obtient ou définit l’intervalle, exprimé en millisecondes, auquel déclencher l’événement Elapsed .

Site

Obtient ou définit le site qui lie le Timer conteneur en mode création.

SynchronizingObject

Obtient ou définit l’objet utilisé pour marshaler les appels de gestionnaire d’événements émis lorsqu’un intervalle s’est écoulé.

Méthodes

Nom Description
BeginInit()

Commence l’initialisation au moment de l’exécution d’un Timer formulaire ou d’un autre composant.

Close()

Libère les ressources utilisées par le Timer.

CreateObjRef(Type)

Crée un objet qui contient toutes les informations pertinentes requises pour générer un proxy utilisé pour communiquer avec un objet distant.

(Hérité de MarshalByRefObject)
Dispose()

Libère toutes les ressources utilisées par le Component.

(Hérité de Component)
Dispose(Boolean)

Libère toutes les ressources utilisées par le fichier actif Timer.

EndInit()

Met fin à l’initialisation au moment de l’exécution d’un Timer formulaire ou d’un autre composant.

Equals(Object)

Détermine si l’objet spécifié est égal à l’objet actuel.

(Hérité de Object)
GetHashCode()

Sert de fonction de hachage par défaut.

(Hérité de Object)
GetLifetimeService()
Obsolète.

Récupère l’objet de service de durée de vie actuel qui contrôle la stratégie de durée de vie de cette instance.

(Hérité de MarshalByRefObject)
GetService(Type)

Retourne un objet qui représente un service fourni par le Component ou par son Container.

(Hérité de Component)
GetType()

Obtient la Type de l’instance actuelle.

(Hérité de Object)
InitializeLifetimeService()
Obsolète.

Obtient un objet de service de durée de vie pour contrôler la stratégie de durée de vie de cette instance.

(Hérité de MarshalByRefObject)
MemberwiseClone()

Crée une copie superficielle du Objectactuel.

(Hérité de Object)
MemberwiseClone(Boolean)

Crée une copie superficielle de l’objet actuel MarshalByRefObject .

(Hérité de MarshalByRefObject)
Start()

Commence à déclencher l’événement Elapsed en définissant Enabled sur true.

Stop()

Arrête de déclencher l’événement Elapsed en définissant Enabled sur false.

ToString()

Retourne un String nom contenant le nom du Component, le cas échéant. Cette méthode ne doit pas être remplacée.

(Hérité de Component)

Événements

Nom Description
Disposed

Se produit lorsque le composant est supprimé par un appel à la Dispose() méthode.

(Hérité de Component)
Elapsed

Se produit lorsque l’intervalle s’écoule.

S’applique à

Cohérence de thread

Tous les membres publics static de ce type sont thread-safe. Il n'y a aucune garantie que les membres d’instance soient thread-safe.

Voir aussi