Exporter (0) Imprimer
Développer tout

Timer, classe

Fournit un mécanisme pour exécuter une méthode à intervalles spécifiés. Cette classe ne peut pas être héritée.

Espace de noms : System.Threading
Assembly : mscorlib (dans mscorlib.dll)

[ComVisibleAttribute(true)] 
public sealed class Timer : MarshalByRefObject, IDisposable
/** @attribute ComVisibleAttribute(true) */ 
public final class Timer extends MarshalByRefObject implements IDisposable
ComVisibleAttribute(true) 
public final class Timer extends MarshalByRefObject implements IDisposable

RemarqueRemarque

L'attribut HostProtectionAttribute appliqué à cette classe a la valeur de propriété Resources suivante : Synchronization | ExternalThreading. HostProtectionAttribute n'affecte pas les applications bureautiques (qui sont généralement démarrées en double-cliquant sur une icône, en tapant une commande ou en entrant une URL dans un navigateur). Pour plus d'informations, consultez la classe HostProtectionAttribute ou Attributs de programmation et de protection des hôtes SQL Server.

Utilisez un délégué TimerCallback pour spécifier la méthode que Timer doit exécuter. Le délégué de la minuterie est spécifié lors de la construction de cette dernière et ne peut pas être modifié. La méthode ne s'exécute pas dans le thread qui a créé la minuterie, mais dans un ThreadPool thread du pool fourni par le système.

Lors de la création d'une minuterie, vous pouvez spécifier la durée d'attente avant la première exécution de la méthode (délai d'attente) et la durée d'attente entre les exécutions suivantes (intervalle de temps). Vous pouvez modifier ces valeurs ou désactiver la minuterie à l'aide de la méthode Change.

RemarqueRemarque

Tant que vous utilisez un Timer, vous devez conserver une référence à celui-ci. À l'instar de tout objet managé, un Timer est susceptible d'être collecté par le garbage collector en l'absence d'une référence. Qu'il soit toujours actif n'empêche pas pour autant le Timer d'être collecté.

Lorsqu'une minuterie devient inutile, utilisez la méthode Dispose pour libérer les ressources qu'elle détient. Pour recevoir un signal lorsque la minuterie est supprimée, utilisez la surcharge de méthode Dispose(WaitHandle) qui prend un WaitHandle. Le WaitHandle est signalé lorsque la minuterie a été supprimée.

La méthode de rappel exécutée par la minuterie doit être réentrante, parce qu'elle est appelée sur des threads ThreadPool. Le rappel peut être exécuté simultanément sur deux threads du pool si l'intervalle de minuterie est inférieur au temps requis pour exécuter le rappel, ou si tous les threads du pool sont en cours d'utilisation et que le rappel est mis en file d'attente plusieurs fois.

RemarqueRemarque

System.Threading.Timer est une minuterie simple et légère qui utilise des méthodes de rappel et qui est fournie par les threads du pool. Vous pouvez également envisager d'utiliser System.Windows.Forms.Timer avec les Windows Forms et System.Timers.Timer pour les fonctionnalités de minuterie serveur. Ces minuteries utilisent des événements et possèdent des fonctionnalités supplémentaires.

L'exemple de code suivant illustre les fonctionnalités de la classe Timer.

using System;
using System.Threading;

class TimerExample
{
    static void Main()
    {
        AutoResetEvent autoEvent     = new AutoResetEvent(false);
        StatusChecker  statusChecker = new StatusChecker(10);

        // Create the delegate that invokes methods for the timer.
        TimerCallback timerDelegate = 
            new TimerCallback(statusChecker.CheckStatus);

        // Create a timer that signals the delegate to invoke 
        // CheckStatus after one second, and every 1/4 second 
        // thereafter.
        Console.WriteLine("{0} Creating timer.\n", 
            DateTime.Now.ToString("h:mm:ss.fff"));
        Timer stateTimer = 
                new Timer(timerDelegate, autoEvent, 1000, 250);

        // When autoEvent signals, change the period to every 
        // 1/2 second.
        autoEvent.WaitOne(5000, false);
        stateTimer.Change(0, 500);
        Console.WriteLine("\nChanging period.\n");

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

class StatusChecker
{
    int invokeCount, 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 Main.
            invokeCount  = 0;
            autoEvent.Set();
        }
    }
}

import System.*;
import System.Threading.*;
import System.Threading.Thread;

class TimerExample
{
    public static void main(String[] args)
    {
        AutoResetEvent autoEvent = new AutoResetEvent(false);
        StatusChecker statusChecker = new StatusChecker(10);

        // Create the delegate that invokes methods for the timer.
        TimerCallback timerDelegate = new TimerCallback(
            statusChecker.CheckStatus);

        // Create a timer that signals the delegate to invoke 
        // CheckStatus after one second, and every 1/4 second 
        // thereafter.
        Console.WriteLine("{0} Creating timer.\n",
            System.DateTime.get_Now().ToString("h:mm:ss.fff"));
        Timer stateTimer = new Timer(timerDelegate, autoEvent, 1000, 250);

        // When autoEvent signals, change the period to every 
        // 1/2 second.
        autoEvent.WaitOne(5000, false);
        stateTimer.Change(0, 500);
        Console.WriteLine("\nChanging period.\n");

        // When autoEvent signals the second time, dispose of 
        // the timer.
        autoEvent.WaitOne(5000, false);
        stateTimer.Dispose();
        Console.WriteLine("\nDestroying timer.");
    } //main
} //TimerExample

class StatusChecker
{
    private int invokeCount, maxCount;

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

    // This method is called by the timer delegate.
    public void CheckStatus(Object stateInfo)
    {
        AutoResetEvent autoEvent = ((AutoResetEvent)(stateInfo));

        Console.WriteLine("{0} Checking status {1,2}.", 
            System.DateTime.get_Now().ToString("h:mm:ss.fff"),
            String.valueOf(++invokeCount));
        if (invokeCount == maxCount) {
            // Reset the counter and signal Main.
            invokeCount = 0;
            autoEvent.Set();
        }
    } //CheckStatus
} //StatusChecker

Ce type est sécurisé pour les opérations multithread.

Windows 98, Windows 2000 SP4, Windows CE, Windows Millennium Edition, Windows Mobile pour Pocket PC, Windows Mobile pour Smartphone, Windows Server 2003, Windows XP Édition Media Center, Windows XP Professionnel Édition x64, Windows XP SP2, Windows XP Starter Edition

Le .NET Framework ne prend pas en charge toutes les versions de chaque plate-forme. Pour obtenir la liste des versions prises en charge, consultez Configuration requise.

.NET Framework

Prise en charge dans : 2.0, 1.1, 1.0

.NET Compact Framework

Prise en charge dans : 2.0, 1.0

Ajouts de la communauté

AJOUTER
Microsoft réalise une enquête en ligne pour recueillir votre opinion sur le site Web de MSDN. Si vous choisissez d’y participer, cette enquête en ligne vous sera présentée lorsque vous quitterez le site Web de MSDN.

Si vous souhaitez y participer,
Afficher:
© 2014 Microsoft