Partager via


Composants Timer thread (C# et Visual Basic)

La classe Timer est utile pour exécuter périodiquement une tâche sur un thread séparé. Par exemple, vous pouvez employer un composant Timer thread pour vérifier l'état et l'intégrité d'une base de données ou pour sauvegarder des fichiers vitaux.

Exemple Timer Thread

L'exemple ci-après lance une tâche toutes les deux secondes et utilise un indicateur pour activer la méthode Dispose qui arrête la minuterie. Cet exemple publie l'état dans la fenêtre Sortie.

Private Class StateObjClass
    ' Used to hold parameters for calls to TimerTask. 
    Public SomeValue As Integer 
    Public TimerReference As System.Threading.Timer
    Public TimerCanceled As Boolean 
End Class 

Public Sub RunTimer()
    Dim StateObj As New StateObjClass
    StateObj.TimerCanceled = False
    StateObj.SomeValue = 1
    Dim TimerDelegate As New System.Threading.TimerCallback(AddressOf TimerTask)
    ' Create a timer that calls a procedure every 2 seconds. 
    ' Note: There is no Start method; the timer starts running as soon as  
    ' the instance is created. 
    Dim TimerItem As New System.Threading.Timer(TimerDelegate, StateObj,
                                                2000, 2000)
    ' Save a reference for Dispose.
    StateObj.TimerReference = TimerItem

    ' Run for ten loops. 
    While StateObj.SomeValue < 10
        ' Wait one second.
        System.Threading.Thread.Sleep(1000)
    End While 

    ' Request Dispose of the timer object.
    StateObj.TimerCanceled = True 
End Sub 

Private Sub TimerTask(ByVal StateObj As Object)
    Dim State As StateObjClass = CType(StateObj, StateObjClass)
    ' Use the interlocked class to increment the counter variable.
    System.Threading.Interlocked.Increment(State.SomeValue)
    System.Diagnostics.Debug.WriteLine("Launched new thread  " & Now.ToString)
    If State.TimerCanceled Then 
        ' Dispose Requested.
        State.TimerReference.Dispose()
        System.Diagnostics.Debug.WriteLine("Done  " & Now)
    End If 
End Sub
private class StateObjClass
{
    // Used to hold parameters for calls to TimerTask. 
    public int SomeValue;
    public System.Threading.Timer TimerReference;
    public bool TimerCanceled;
}

public void RunTimer()
{
    StateObjClass StateObj = new StateObjClass();
    StateObj.TimerCanceled = false;
    StateObj.SomeValue = 1;
    System.Threading.TimerCallback TimerDelegate =
        new System.Threading.TimerCallback(TimerTask);

    // Create a timer that calls a procedure every 2 seconds. 
    // Note: There is no Start method; the timer starts running as soon as  
    // the instance is created.
    System.Threading.Timer TimerItem =
        new System.Threading.Timer(TimerDelegate, StateObj, 2000, 2000);

    // Save a reference for Dispose.
    StateObj.TimerReference = TimerItem;  

    // Run for ten loops. 
    while (StateObj.SomeValue < 10) 
    {
        // Wait one second.
        System.Threading.Thread.Sleep(1000);  
    }

    // Request Dispose of the timer object.
    StateObj.TimerCanceled = true;  
}

private void TimerTask(object StateObj)
{
    StateObjClass State = (StateObjClass)StateObj;
    // Use the interlocked class to increment the counter variable.
    System.Threading.Interlocked.Increment(ref State.SomeValue);
    System.Diagnostics.Debug.WriteLine("Launched new thread  " + DateTime.Now.ToString());
    if (State.TimerCanceled)    
    // Dispose Requested.
    {
        State.TimerReference.Dispose();
        System.Diagnostics.Debug.WriteLine("Done  " + DateTime.Now.ToString());
    }
}

Les composants Timer thread sont particulièrement utiles lorsque l'objet Timer n'est pas disponible, par exemple lorsque vous développez des applications console.

Voir aussi

Référence

System.Threading

Concepts

Applications multithread (C# et Visual Basic)