Freigeben über


Timer-Konstruktor (TimerCallback, Object, TimeSpan, TimeSpan)

Initialisiert eine neue Instanz der Timer-Klasse unter Verwendung von TimeSpan-Werten zum Messen von Zeitintervallen.

Namespace: System.Threading
Assembly: mscorlib (in mscorlib.dll)

Syntax

'Declaration
Public Sub New ( _
    callback As TimerCallback, _
    state As Object, _
    dueTime As TimeSpan, _
    period As TimeSpan _
)
'Usage
Dim callback As TimerCallback
Dim state As Object
Dim dueTime As TimeSpan
Dim period As TimeSpan

Dim instance As New Timer(callback, state, dueTime, period)
public Timer (
    TimerCallback callback,
    Object state,
    TimeSpan dueTime,
    TimeSpan period
)
public:
Timer (
    TimerCallback^ callback, 
    Object^ state, 
    TimeSpan dueTime, 
    TimeSpan period
)
public Timer (
    TimerCallback callback, 
    Object state, 
    TimeSpan dueTime, 
    TimeSpan period
)
public function Timer (
    callback : TimerCallback, 
    state : Object, 
    dueTime : TimeSpan, 
    period : TimeSpan
)

Parameter

  • callback
    Ein TimerCallback-Delegat, der die auszuführende Methode darstellt.
  • state
    Ein Objekt, das die von der Rückrufmethode zu verwendenden Informationen enthält, oder NULL (Nothing in Visual Basic).
  • dueTime
    Die TimeSpan, die die Zeitspanne darstellt, die gewartet werden soll, bis der callback-Parameter die zugehörigen Methoden aufruft. Geben Sie -1 Millisekunde an, um das Starten des Zeitgebers zu verhindern. Geben Sie 0 (null) an, um den Zeitgeber sofort zu starten.
  • period
    Das Zeitintervall zwischen Aufrufen der Methoden, auf die durch callback verwiesen wird. Geben Sie -1 Millisekunde an, um periodisches Signalisieren zu deaktivieren.

Ausnahmen

Ausnahmetyp Bedingung

ArgumentOutOfRangeException

Die Anzahl der Millisekunden im Wert von dueTime oder period ist negativ und ungleich Infinite oder größer als MaxValue.

ArgumentNullException

Der callback-Parameter ist NULL (Nothing in Visual Basic).

Hinweise

Der vom callback-Parameter angegebene Delegat wird einmal nach dem Ablauf von dueTime und anschließend bei jedem Ablauf des period-Zeitintervalls aufgerufen.

Hinweis

Benutzer von Visual Basic können den TimerCallback-Konstruktor auslassen und stattdessen beim Angeben der Rückrufmethode den AddressOf-Operator verwenden. Visual Basic ruft automatisch den richtigen Delegatkonstruktor auf.

Wenn dueTime 0 (null) ist, wird callback sofort aufgerufen. Wenn dueTime -1 Millisekunde beträgt, wird callback nicht aufgerufen. Der Zeitgeber ist deaktiviert, er kann aber durch das Aufrufen der Change-Methode erneut aktiviert werden.

Wenn period 0 (null) oder -1 Millisekunden beträgt und dueTime positiv ist, wird callback einmal aufgerufen. Das periodische Verhalten des Zeitgebers ist deaktiviert, kann aber mithilfe der Change-Methode erneut aktiviert werden.

Die für callback angegebene Methode sollte eine Wiedereintrittsmethode sein, da sie für ThreadPool-Threads aufgerufen wird. Die Methode kann gleichzeitig für zwei Threadpoolthreads ausgeführt werden, wenn das Zeitgeberintervall unter der für die Ausführung der Methode erforderlichen Zeit liegt oder alle Threadpoolthreads verwendet werden und die Methode mehrfach in die Warteschlange gestellt wird.

Beispiel

Das folgende Codebeispiel veranschaulicht das Erstellen eines TimerCallback-Delegaten und das Initialisieren einer neuen Instanz der Timer-Klasse.

Imports Microsoft.VisualBasic
Imports System
Imports System.Threading

Public Class TimerExample

    <MTAThread> _
    Shared Sub Main()
    
        Dim autoEvent As New AutoResetEvent(False)
        Dim statusChecker As New StatusChecker(10)

        ' Create the delegate that invokes methods for the timer.
        Dim timerDelegate As TimerCallback = _
            AddressOf statusChecker.CheckStatus

        Dim delayTime As New TimeSpan(0, 0, 1)
        Dim intervalTime As New TimeSpan(0, 0, 0, 0, 250)

        ' Create a timer that signals the delegate to invoke 
        ' CheckStatus after one second, and every 1/4 second 
        ' thereafter.
        Console.WriteLine("{0} Creating timer." & vbCrLf, _
            DateTime.Now.ToString("h:mm:ss.fff"))
        Dim stateTimer As Timer = New Timer( _
            timerDelegate, autoEvent, delayTime, intervalTime)

        ' When autoEvent signals, change the period to every 
        ' 1/2 second.
        autoEvent.WaitOne(5000, False)
        stateTimer.Change( _
            new TimeSpan(0), intervalTime.Add(intervalTime))
        Console.WriteLine(vbCrLf & "Changing period." & vbCrLf)

        ' When autoEvent signals the second time, dispose of 
        ' the timer.
        autoEvent.WaitOne(5000, False)
        stateTimer.Dispose()
        Console.WriteLine(vbCrLf & "Destroying timer.")
    
    End Sub
End Class

Public Class StatusChecker

    Dim invokeCount, maxCount As Integer 

    Sub New(count As Integer)
        invokeCount  = 0
        maxCount = count
    End Sub

    ' This method is called by the timer delegate.
    Sub CheckStatus(stateInfo As Object)
        Dim autoEvent As AutoResetEvent = _
            DirectCast(stateInfo, AutoResetEvent)
        invokeCount += 1
        Console.WriteLine("{0} Checking status {1,2}.", _
            DateTime.Now.ToString("h:mm:ss.fff"), _
            invokeCount.ToString())

        If invokeCount = maxCount Then
        
            ' Reset the counter and signal to stop the timer.
            invokeCount  = 0
            autoEvent.Set()
        End If
    End Sub

End Class
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);

        TimeSpan delayTime = new TimeSpan(0, 0, 1);
        TimeSpan intervalTime = new TimeSpan(0, 0, 0, 0, 250);

        // 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, delayTime, intervalTime);

        // When autoEvent signals, change the period to every 
        // 1/2 second.
        autoEvent.WaitOne(5000, false);
        stateTimer.Change(new TimeSpan(0), 
            intervalTime + intervalTime);
        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();
        }
    }
}
using namespace System;
using namespace System::Threading;
ref class StatusChecker
{
private:
   int invokeCount;
   int maxCount;

public:
   StatusChecker( int count )
      : invokeCount( 0 ), maxCount( count )
   {}


   // This method is called by the timer delegate.
   void CheckStatus( Object^ stateInfo )
   {
      AutoResetEvent^ autoEvent = dynamic_cast<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();
      }
   }

};

int main()
{
   AutoResetEvent^ autoEvent = gcnew AutoResetEvent( false );
   StatusChecker^ statusChecker = gcnew StatusChecker( 10 );
   
   // Create the delegate that invokes methods for the timer.
   TimerCallback^ timerDelegate = gcnew TimerCallback( statusChecker, &StatusChecker::CheckStatus );
   TimeSpan delayTime = TimeSpan(0,0,1);
   TimeSpan intervalTime = TimeSpan(0,0,0,0,250);
   
   // 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 = gcnew Timer( timerDelegate,autoEvent,delayTime,intervalTime );
   
   // When autoEvent signals, change the period to every 1/2 second.
   autoEvent->WaitOne( 5000, false );
   stateTimer->Change( TimeSpan(0), intervalTime + intervalTime );
   Console::WriteLine( "\nChanging period.\n" );
   
   // When autoEvent signals the second time, dispose of the timer.
   autoEvent->WaitOne( 5000, false );
   stateTimer->~Timer();
   Console::WriteLine( "\nDestroying timer." );
}
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);
        TimeSpan delayTime = new TimeSpan(0, 0, 1);
        TimeSpan intervalTime = new TimeSpan(0, 0, 0, 0, 250);

        // 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, 
            delayTime, intervalTime);

        // When autoEvent signals, change the period to every 
        // 1/2 second.
        autoEvent.WaitOne(5000, false);
        stateTimer.Change(new TimeSpan(0), intervalTime.Add(intervalTime));
        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

Plattformen

Windows 98, Windows 2000 SP4, Windows Millennium Edition, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition

.NET Framework unterstützt nicht alle Versionen sämtlicher Plattformen. Eine Liste der unterstützten Versionen finden Sie unter Systemanforderungen.

Versionsinformationen

.NET Framework

Unterstützt in: 2.0, 1.1, 1.0

.NET Compact Framework

Unterstützt in: 2.0, 1.0

Siehe auch

Referenz

Timer-Klasse
Timer-Member
System.Threading-Namespace

Weitere Ressourcen

Zeitgeber