Timer Klas

Definitie

Biedt een mechanisme voor het uitvoeren van een methode op een threadpoolthread met opgegeven intervallen. Deze klasse kan niet worden overgenomen.

public ref class Timer sealed : IDisposable
public ref class Timer sealed : MarshalByRefObject, IDisposable
public ref class Timer sealed : MarshalByRefObject, IAsyncDisposable, IDisposable
[System.Runtime.InteropServices.ComVisible(true)]
public sealed class Timer : IDisposable
public sealed class Timer : MarshalByRefObject, IDisposable
[System.Runtime.InteropServices.ComVisible(true)]
public sealed class Timer : MarshalByRefObject, IDisposable
public sealed class Timer : MarshalByRefObject, IAsyncDisposable, IDisposable
[<System.Runtime.InteropServices.ComVisible(true)>]
type Timer = class
    interface IDisposable
type Timer = class
    inherit MarshalByRefObject
    interface IDisposable
[<System.Runtime.InteropServices.ComVisible(true)>]
type Timer = class
    inherit MarshalByRefObject
    interface IDisposable
type Timer = class
    inherit MarshalByRefObject
    interface IAsyncDisposable
    interface IDisposable
Public NotInheritable Class Timer
Implements IDisposable
Public NotInheritable Class Timer
Inherits MarshalByRefObject
Implements IDisposable
Public NotInheritable Class Timer
Inherits MarshalByRefObject
Implements IAsyncDisposable, IDisposable
Overname
Timer
Overname
Kenmerken
Implementeringen

Voorbeelden

In het volgende voorbeeld wordt een StatusChecker klasse gedefinieerd die een CheckStatus methode bevat waarvan de handtekening hetzelfde is als de TimerCallback gemachtigde. Het state argument van de CheckStatus methode is een AutoResetEvent object dat wordt gebruikt voor het synchroniseren van de toepassingsthread en de threadgroepthread waarmee de callback-gemachtigde wordt uitgevoerd. De StatusChecker klasse bevat ook twee statusvariabelen:

invokeCount
Geeft het aantal keren aan dat de callback-methode is aangeroepen.

maxCount
Bepaalt het maximum aantal keren dat de callback-methode moet worden aangeroepen.

De toepassingsthread maakt de timer, die één seconde wacht en vervolgens de CheckStatus callback-methode elke 250 milliseconden uitvoert. De toepassingsthread wordt vervolgens geblokkeerd totdat het AutoResetEvent object wordt gesignaleerd. Wanneer de CheckStatus callback-methode tijden uitvoert maxCount , wordt de AutoResetEvent.Set methode aangeroepen om de status van het AutoResetEvent object in te stellen op gesignaleerd. De eerste keer dat dit gebeurt, roept de toepassingsthread de Change(Int32, Int32) methode aan, zodat de callback-methode nu elke halve seconde wordt uitgevoerd. Het wordt opnieuw geblokkeerd totdat het AutoResetEvent object wordt gesignaleerd. Als dit gebeurt, wordt de timer vernietigd door de methode aan Dispose te roepen en wordt de toepassing beëindigd.

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.

Opmerkingen

Gebruik een TimerCallback gemachtigde om de methode op te geven die u wilt Timer uitvoeren. De handtekening van de TimerCallback gemachtigde is:

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

De gemachtigde van de timer wordt opgegeven wanneer de timer is samengesteld en kan niet worden gewijzigd. De methode wordt niet uitgevoerd op de thread die de timer heeft gemaakt; het wordt uitgevoerd op een ThreadPool thread die door het systeem wordt geleverd.

Tip

.NET bevat verschillende timerklassen, die elk verschillende functionaliteit bieden:

  • System.Timers.Timer, waarmee een gebeurtenis wordt geactiveerd en de code met regelmatige tussenpozen in een of meer gebeurtenissinks wordt uitgevoerd. De klasse is bedoeld voor gebruik als een server- of serviceonderdeel in een omgeving met meerderereads; het heeft geen gebruikersinterface en is niet zichtbaar tijdens runtime.
  • System.Threading.Timer, waarmee met regelmatige tussenpozen één callback-methode op een threadgroepthread wordt uitgevoerd. De callback-methode wordt gedefinieerd wanneer de timer wordt geïnstantieerd en niet kan worden gewijzigd. Net als de System.Timers.Timer klasse is deze klasse bedoeld voor gebruik als een server- of serviceonderdeel in een omgeving met meerderereads. Deze klasse heeft geen gebruikersinterface en is tijdens runtime niet zichtbaar.
  • System.Windows.Forms.Timer, een Windows Forms onderdeel dat een gebeurtenis afvuurt en de code uitvoert in een of meer gebeurtenissinks met regelmatige tussenpozen. Het onderdeel heeft geen gebruikersinterface en is ontworpen voor gebruik in een omgeving met één thread; het wordt uitgevoerd op de UI-thread.
  • System.Web.UI.Timer (alleen .NET Framework), een ASP.NET-onderdeel waarmee asynchrone of synchrone postbacks op webpagina's met een regelmatig interval worden uitgevoerd.
  • System.Windows.Threading.DispatcherTimer, een timer die is geïntegreerd in de Dispatcher wachtrij. Deze timer wordt verwerkt met een opgegeven prioriteit op een opgegeven tijdsinterval.

Wanneer u een timer maakt, kunt u een hoeveelheid tijd opgeven die moet worden gewacht voordat de methode voor het eerst wordt uitgevoerd (vervaldatum) en een hoeveelheid tijd die moet worden gewacht tussen volgende uitvoeringen (periode). De Timer klasse heeft dezelfde resolutie als de systeemklok. Dit betekent dat als de periode kleiner is dan de resolutie van de systeemklok, de TimerCallback gedelegeerde wordt uitgevoerd met intervallen die zijn gedefinieerd door de resolutie van de systeemklok, die ongeveer 15 milliseconden op Windows 7- en Windows 8 systemen is. U kunt de einddatum en -periode wijzigen of de timer uitschakelen met behulp van de Change methode.

Note

Zolang u een Timerbestand gebruikt, moet u er een verwijzing naar behouden. Net als bij een beheerd object is een Timer garbagecollection onderhevig aan garbagecollection wanneer er geen verwijzingen naar zijn. Het feit dat een Timer nog steeds actief is, verhindert niet dat het wordt verzameld.

Note

De systeemklok die wordt gebruikt, is dezelfde klok die wordt gebruikt door GetTickCount, die niet wordt beïnvloed door wijzigingen die zijn aangebracht met timeBeginPeriod en timeEndPeriod.

Wanneer een timer niet meer nodig is, gebruikt u de Dispose methode om de resources die door de timer worden bewaard, vrij te maken. Houd er rekening mee dat callbacks kunnen optreden nadat de Dispose() methode overbelast is, omdat de timer callbacks voor uitvoering door threadpoolthreads in de wachtrij zet. U kunt de overbelasting van de Dispose(WaitHandle) methode gebruiken om te wachten totdat alle callbacks zijn voltooid.

De callback-methode die door de timer wordt uitgevoerd, moet opnieuw worden gestart, omdat deze wordt aangeroepen op ThreadPool threads. De callback kan tegelijkertijd worden uitgevoerd op twee threadgroepthreads als het timerinterval minder is dan de tijd die nodig is om de callback uit te voeren, of als alle threadgroepthreads in gebruik zijn en de callback meerdere keren in de wachtrij wordt geplaatst.

Note

System.Threading.Timer is een eenvoudige, lichtgewicht timer die callback-methoden gebruikt en wordt geleverd door thread-poolthreads. Het wordt niet aanbevolen voor gebruik met Windows Forms, omdat de callbacks niet plaatsvinden op de gebruikersinterfacethread. System.Windows.Forms.Timer is een betere keuze voor gebruik met Windows Forms. Voor servergebaseerde timerfunctionaliteit kunt u overwegen om gebeurtenissen te gebruiken System.Timers.Timer, wat gebeurtenissen genereert en aanvullende functies heeft.

Constructors

Name Description
Timer(TimerCallback, Object, Int32, Int32)

Initialiseert een nieuw exemplaar van de Timer klasse met behulp van een 32-bits geheel getal dat is ondertekend om het tijdsinterval op te geven.

Timer(TimerCallback, Object, Int64, Int64)

Initialiseert een nieuw exemplaar van de Timer klasse met behulp van 64-bits ondertekende gehele getallen om tijdsintervallen te meten.

Timer(TimerCallback, Object, TimeSpan, TimeSpan)

Initialiseert een nieuw exemplaar van de Timer klasse met behulp van TimeSpan waarden om tijdsintervallen te meten.

Timer(TimerCallback, Object, UInt32, UInt32)

Initialiseert een nieuw exemplaar van de Timer klasse met behulp van 32-bits niet-ondertekende gehele getallen om tijdsintervallen te meten.

Timer(TimerCallback)

Initialiseert een nieuw exemplaar van de Timer klasse met een oneindige periode en een oneindige einddatum, waarbij het zojuist gemaakte object wordt gebruikt Timer als het statusobject.

Methoden

Name Description
Change(Int32, Int32)

Hiermee wijzigt u de begintijd en het interval tussen methode-aanroepen voor een timer met behulp van 32-bits ondertekende gehele getallen om tijdsintervallen te meten.

Change(Int64, Int64)

Hiermee wijzigt u de begintijd en het interval tussen methode-aanroepen voor een timer met behulp van 64-bits ondertekende gehele getallen om tijdsintervallen te meten.

Change(TimeSpan, TimeSpan)

Hiermee wijzigt u de begintijd en het interval tussen methode-aanroepen voor een timer, waarbij TimeSpan waarden worden gebruikt om tijdsintervallen te meten.

Change(UInt32, UInt32)

Hiermee wijzigt u de begintijd en het interval tussen methodeaanroepen voor een timer met behulp van 32-bits niet-ondertekende gehele getallen om tijdsintervallen te meten.

CreateObjRef(Type)

Hiermee maakt u een object dat alle relevante informatie bevat die nodig is om een proxy te genereren die wordt gebruikt om te communiceren met een extern object.

(Overgenomen van MarshalByRefObject)
Dispose()

Alle resources die worden gebruikt door het huidige exemplaar van Timer.

Dispose(WaitHandle)

Geeft alle resources vrij die door het huidige exemplaar van Timer en signalen worden gebruikt wanneer de timer is verwijderd.

DisposeAsync()

Alle resources die worden gebruikt door het huidige exemplaar van Timer.

Equals(Object)

Bepaalt of het opgegeven object gelijk is aan het huidige object.

(Overgenomen van Object)
Finalize()

Hiermee kan een object resources vrijmaken en andere opschoonbewerkingen uitvoeren voordat het wordt vrijgemaakt door garbagecollection.

GetHashCode()

Fungeert als de standaardhashfunctie.

(Overgenomen van Object)
GetLifetimeService()

Hiermee haalt u het huidige levensduurserviceobject op waarmee het levensduurbeleid voor dit exemplaar wordt beheerd.

(Overgenomen van MarshalByRefObject)
GetType()

Hiermee haalt u de Type huidige instantie op.

(Overgenomen van Object)
InitializeLifetimeService()

Hiermee haalt u een levensduurserviceobject op om het levensduurbeleid voor dit exemplaar te beheren.

(Overgenomen van MarshalByRefObject)
MemberwiseClone()

Hiermee maakt u een ondiepe kopie van de huidige Object.

(Overgenomen van Object)
MemberwiseClone(Boolean)

Hiermee maakt u een ondiepe kopie van het huidige MarshalByRefObject object.

(Overgenomen van MarshalByRefObject)
ToString()

Retourneert een tekenreeks die het huidige object vertegenwoordigt.

(Overgenomen van Object)

Extensiemethoden

Name Description
ConfigureAwait(IAsyncDisposable, Boolean)

Hiermee configureert u hoe wacht op de taken die worden geretourneerd op basis van een asynchroon wegwerp, worden uitgevoerd.

Van toepassing op

Veiligheid thread

Dit type is thread veilig.

Zie ook