Timer Klasa

Definicja

Udostępnia mechanizm wykonywania metody w wątku puli wątków w określonych odstępach czasu. Tej klasy nie można dziedziczyć.

C#
[System.Runtime.InteropServices.ComVisible(true)]
public sealed class Timer : IDisposable
C#
public sealed class Timer : MarshalByRefObject, IAsyncDisposable, IDisposable
C#
public sealed class Timer : MarshalByRefObject, System.Threading.ITimer
C#
public sealed class Timer : MarshalByRefObject, IDisposable
C#
[System.Runtime.InteropServices.ComVisible(true)]
public sealed class Timer : MarshalByRefObject, IDisposable
Dziedziczenie
Timer
Dziedziczenie
Atrybuty
Implementuje

Przykłady

W poniższym przykładzie zdefiniowano klasę StatusChecker zawierającą metodę CheckStatus, której podpis jest taki sam jak delegat TimerCallback. Argumentem state metody CheckStatus jest obiekt AutoResetEvent używany do synchronizowania wątku aplikacji i wątku puli wątków wykonującego delegata wywołania zwrotnego. Klasa StatusChecker zawiera również dwie zmienne stanu:

invokeCount Wskazuje liczbę wywołań zwrotnych metody wywołania zwrotnego.

maxCount Określa maksymalną liczbę wywołań zwrotnych metody wywołania zwrotnego.

Wątek aplikacji tworzy czasomierz, który czeka jedną sekundę, a następnie wykonuje metodę wywołania zwrotnego CheckStatus co 250 milisekund. Następnie wątek aplikacji blokuje się do momentu zasygnalizowanego obiektu AutoResetEvent. Gdy metoda wywołania zwrotnego CheckStatus wykonuje maxCount razy, wywołuje metodę AutoResetEvent.Set, aby ustawić stan obiektu AutoResetEvent na sygnalizowany. Po raz pierwszy w tym przypadku wątek aplikacji wywołuje metodę Change(Int32, Int32), tak aby metoda wywołania zwrotnego wykonywała teraz co połowę sekundy. Po raz kolejny blokuje, dopóki obiekt AutoResetEvent nie zostanie zasygnalizowany. W takim przypadku czasomierz jest niszczony przez wywołanie metody Dispose, a aplikacja kończy działanie.

C#
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.

Uwagi

Użyj delegata TimerCallback, aby określić metodę, którą ma wykonać Timer. Podpis delegata TimerCallback to:

C#
void TimerCallback(Object state)

Delegat czasomierza jest określony podczas konstruowania czasomierza i nie można go zmienić. Metoda nie jest wykonywana w wątku, który utworzył czasomierz; jest wykonywany w wątku ThreadPool dostarczonym przez system.

Napiwek

Platforma .NET zawiera kilka klas czasomierza, z których każda oferuje różne funkcje:

  • System.Timers.Timer, który uruchamia zdarzenie i wykonuje kod w co najmniej jednym ujściu zdarzeń w regularnych odstępach czasu. Klasa jest przeznaczona do użycia jako składnik usługi lub oparty na serwerze w środowisku wielowątkowym; nie ma interfejsu użytkownika i nie jest widoczny w czasie wykonywania.
  • System.Threading.Timer, która wykonuje pojedynczą metodę wywołania zwrotnego w wątku puli wątków w regularnych odstępach czasu. Metoda wywołania zwrotnego jest definiowana po utworzeniu wystąpienia czasomierza i nie można jej zmienić. Podobnie jak klasa System.Timers.Timer, ta klasa jest przeznaczona do użycia jako składnik oparty na serwerze lub usługi w środowisku wielowątkowym; nie ma interfejsu użytkownika i nie jest widoczny w czasie wykonywania.
  • System.Windows.Forms.Timerskładnik Windows Forms, który uruchamia zdarzenie i wykonuje kod w co najmniej jednym ujściu zdarzeń w regularnych odstępach czasu. Składnik nie ma interfejsu użytkownika i jest przeznaczony do użytku w środowisku jednowątkowym; jest wykonywany w wątku interfejsu użytkownika.
  • System.Web.UI.Timer (tylko program .NET Framework), składnik ASP.NET, który wykonuje asynchroniczne lub synchroniczne ogłaszanie zwrotne stron internetowych w regularnym odstępie czasu.
  • System.Windows.Threading.DispatcherTimer, czasomierz zintegrowany z kolejką Dispatcher. Ten czasomierz jest przetwarzany z określonym priorytetem w określonym przedziale czasu.

Podczas tworzenia czasomierza można określić czas oczekiwania przed pierwszym wykonaniem metody (czas ukończenia) oraz czas oczekiwania między kolejnymi wykonaniami (okresem). Klasa Timer ma taką samą rozdzielczość jak zegar systemowy. Oznacza to, że jeśli okres jest mniejszy niż rozdzielczość zegara systemowego, delegat TimerCallback będzie wykonywany w odstępach czasu zdefiniowanego przez rozdzielczość zegara systemowego, który wynosi około 15 milisekund w systemach Windows 7 i Windows 8. Możesz zmienić czas ukończenia i okres lub wyłączyć czasomierz przy użyciu metody Change.

Uwaga

Tak długo, jak używasz Timer, musisz zachować do niego odwołanie. Podobnie jak w przypadku dowolnego obiektu zarządzanego, Timer podlega odśmieceniu pamięci, gdy nie ma do niego odwołań. Fakt, że Timer jest nadal aktywny, nie uniemożliwia zbierania.

Uwaga

Zegar systemowy, który jest używany jest ten sam zegar używany przez GetTickCount, który nie ma wpływu na zmiany wprowadzone w timeBeginPeriod i timeEndPeriod.

Gdy czasomierz nie jest już potrzebny, użyj metody Dispose, aby zwolnić zasoby przechowywane przez czasomierz. Należy pamiętać, że wywołania zwrotne mogą wystąpić po wywołaniu przeciążenia metody Dispose(), ponieważ kolejki czasomierza kolejkują wywołania zwrotne do wykonania przez wątki puli wątków. Możesz użyć przeciążenia metody Dispose(WaitHandle), aby poczekać na zakończenie wszystkich wywołań zwrotnych.

Metoda wywołania zwrotnego wykonywana przez czasomierz powinna być stosowana ponownie, ponieważ jest wywoływana w ThreadPool wątkach. Wywołanie zwrotne można wykonać jednocześnie w dwóch wątkach puli wątków, jeśli interwał czasomierza jest krótszy niż czas wymagany do wykonania wywołania zwrotnego lub jeśli wszystkie wątki puli wątków są używane, a wywołanie zwrotne jest kolejkowane wiele razy.

Uwaga

System.Threading.Timer to prosty, lekki czasomierz korzystający z metod wywołania zwrotnego i obsługiwany przez wątki puli wątków. Nie zaleca się używania z formularzami systemu Windows, ponieważ jego wywołania zwrotne nie występują w wątku interfejsu użytkownika. System.Windows.Forms.Timer jest lepszym wyborem do użycia z formularzami systemu Windows. W przypadku funkcji czasomierza opartego na serwerze warto rozważyć użycie System.Timers.Timer, która zgłasza zdarzenia i ma dodatkowe funkcje.

Konstruktory

Timer(TimerCallback)

Inicjuje nowe wystąpienie klasy Timer z nieskończonym okresem i nieskończonym czasem ukończenia, używając nowo utworzonego obiektu Timer jako obiektu stanu.

Timer(TimerCallback, Object, Int32, Int32)

Inicjuje nowe wystąpienie klasy Timer, używając 32-bitowej liczby całkowitej ze znakiem, aby określić interwał czasu.

Timer(TimerCallback, Object, Int64, Int64)

Inicjuje nowe wystąpienie klasy Timer, używając 64-bitowych liczb całkowitych ze znakiem do mierzenia interwałów czasu.

Timer(TimerCallback, Object, TimeSpan, TimeSpan)

Inicjuje nowe wystąpienie klasy Timer przy użyciu wartości TimeSpan do mierzenia interwałów czasu.

Timer(TimerCallback, Object, UInt32, UInt32)

Inicjuje nowe wystąpienie klasy Timer, używając 32-bitowych liczb całkowitych bez znaku w celu mierzenia interwałów czasu.

Właściwości

ActiveCount

Pobiera liczbę czasomierzy, które są obecnie aktywne. Aktywny czasomierz jest zarejestrowany w celu zaznacznia w pewnym momencie w przyszłości i nie został jeszcze anulowany.

Metody

Change(Int32, Int32)

Zmienia czas rozpoczęcia i interwał między wywołaniami metody dla czasomierza, używając 32-bitowych liczb całkowitych ze znakiem w celu mierzenia interwałów czasu.

Change(Int64, Int64)

Zmienia czas rozpoczęcia i interwał między wywołaniami metod dla czasomierza, używając 64-bitowych liczb całkowitych ze znakiem w celu mierzenia interwałów czasu.

Change(TimeSpan, TimeSpan)

Zmienia czas rozpoczęcia i interwał między wywołaniami metody dla czasomierza, używając wartości TimeSpan do mierzenia interwałów czasu.

Change(UInt32, UInt32)

Zmienia czas rozpoczęcia i interwał między wywołaniami metod dla czasomierza, używając 32-bitowych liczb całkowitych bez znaku w celu mierzenia interwałów czasu.

CreateObjRef(Type)

Tworzy obiekt zawierający wszystkie istotne informacje wymagane do wygenerowania serwera proxy używanego do komunikowania się z obiektem zdalnym.

(Odziedziczone po MarshalByRefObject)
Dispose()

Zwalnia wszystkie zasoby używane przez bieżące wystąpienie Timer.

Dispose(WaitHandle)

Zwalnia wszystkie zasoby używane przez bieżące wystąpienie Timer i sygnały, gdy czasomierz został usunięty.

DisposeAsync()

Zwalnia wszystkie zasoby używane przez bieżące wystąpienie Timer.

Equals(Object)

Określa, czy określony obiekt jest równy bieżącemu obiektowi.

(Odziedziczone po Object)
Finalize()

Umożliwia obiektowi próbę zwolnienia zasobów i wykonania innych operacji oczyszczania przed odzyskaniem przez odzyskiwanie pamięci.

GetHashCode()

Służy jako domyślna funkcja skrótu.

(Odziedziczone po Object)
GetLifetimeService()
Przestarzałe.

Pobiera bieżący obiekt usługi okresu istnienia, który kontroluje zasady okresu istnienia dla tego wystąpienia.

(Odziedziczone po MarshalByRefObject)
GetType()

Pobiera Type bieżącego wystąpienia.

(Odziedziczone po Object)
InitializeLifetimeService()
Przestarzałe.

Uzyskuje obiekt usługi okresu istnienia w celu kontrolowania zasad okresu istnienia dla tego wystąpienia.

(Odziedziczone po MarshalByRefObject)
MemberwiseClone()

Tworzy płytkią kopię bieżącego Object.

(Odziedziczone po Object)
MemberwiseClone(Boolean)

Tworzy płytkią kopię bieżącego obiektu MarshalByRefObject.

(Odziedziczone po MarshalByRefObject)
ToString()

Zwraca ciąg reprezentujący bieżący obiekt.

(Odziedziczone po Object)

Metody rozszerzania

ConfigureAwait(IAsyncDisposable, Boolean)

Konfiguruje, w jaki sposób będą wykonywane oczekiwania na zadania zwrócone z asynchronicznego jednorazowego użytku.

Dotyczy

Produkt Wersje
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.2, 1.3, 1.4, 1.6, 2.0, 2.1
UWP 10.0

Bezpieczeństwo wątkowe

Ten typ jest bezpieczny wątkiem.

Zobacz też